vlad zouth
vlad zouth

Reputation: 101

Passing function pointer to arg of pthread_create function

I have a function void startScanner(...) taking two function pointer as arguments: userType *vConfig(void) and void * vCallback(void). In this function i would like to create a thread and call vCallback() function in the function thread created. So i decided to pass vCallback as args to pthreadcreate. The code of startScanner function :

void startScanner(tUsrStatus (*vConfig)(), void* (vCallback)()){

    if(pthread_create(&scannerThread, NULL, scannerThreadFunc, vCallback))
    {
        printf("Thread creation fails!\n");
    }
}

The scannerTread function:

static void *scannerThreadFunc(void *arg()){

    void *funcptr(void) = arg;

    while(1)
    {
        funcptr();
    }
    pthread_exit(NULL);
}

I get the following error:

error: function ‘funcptr’ is initialized like a variable
error: nested function ‘funcptr’ declared but never defined

How can i fix this?

Upvotes: 2

Views: 1508

Answers (1)

user2371524
user2371524

Reputation:

Syntax errors aside (*) , it's impossible in standard C to pass a function pointer in a void *. There's a fundamental difference between pointers to functions and pointers to data, they can't be converted into each other. This is because there might be platforms where function and data pointers would differ even in size, or refer to different address spaces, or whatever.

But of course, there's a simple way to achieve what you want: Put your function pointer inside a struct and pass a pointer to that.

typedef (*callback)(void);

typedef struct threadargs
{
    callback cb;
} threadargs;

void mycallback(void)
{
    // ...
}

void *threadfunc(void *arg)
{
    threadargs *ta = arg;

    // call your callback:
    ta->cb();

    return ta; // or: return 0, or some pthread_exit(), ...
}

int main(void)
{
    pthread_t thread;
    threadargs ta = { mycallback };
    pthread_create(&thread, 0, threadfunc, &ta);

    // make sure "ta" lives for as long as the thread executes,
    // here just wait until it exits:
    pthread_join(&thread, 0);
}

add error checking etc.


(*) as for the concrete error you're getting, a function pointer needs parantheses around the identifier, so instead of

void *funcptr(void) = arg;

you'd have to write

void (*funcptr)(void) = arg;

To facilitate the usage of function pointers, it's common to typedef them, as seen in my example above. Anyways, as explained above, this wouldn't solve your problem here.

Upvotes: 4

Related Questions