anisha@linux-y3pi:~> g++ conditionVarTEST.cpp -Wall
conditionVarTEST.cpp: In function ‘int main()’:
conditionVarTEST.cpp:33:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:33:53: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
conditionVarTEST.cpp:34:53: error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’
conditionVarTEST.cpp:34:53: error: initializing argument 3 of ‘int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)’
Line number 33 is this:
pthread_create (&A, NULL, (void *) &functionA, NULL);
Declaration of functionA
is this:
void functionA (void*);
Its definition is:
void functionA (void* argA)
{
while (1)
{
pthread_mutex_lock (&mutexA);
if (count < 0)
{
pthread_cond_wait (&conditionVariableA, &mutexA);
}
else
{
// Do something.
std :: cout << "\nTime to enjoy!";
}
pthread_mutex_unlock (&mutexA);
}
}
(void *) &functionA
will cast your function pointerfunctionA
which is of typevoid (*)(void*)
to a simplevoid*
. The later can't be converted to the first again, so the compiler reports an error. This is one of the reasons why you shouldn't use C-style casts.Use
pthread_create (&A, NULL, functionA, NULL);
instead.Also, the return type of a thread function should be
void*
, notvoid
. So changevoid functionA(void*)
tovoid* functionA(void*)
.Use
instead of casting.
Also the function you use to pass to pthread_create should return a
void*
so to avoid any problems later, consider changing the function signature to accomodate this.And as you are using a C++ compiler, you should use a function with C binding, as pthread_create expects a C function:
C++ and C may have the same calling conventions on your current platform, but there is no guaranty, that this will be the case on other platforms or will be so in the future.
If you look at the manual page you will see that the function argument is
That is, a pointer to a function which takes one
void *
argument and returnsvoid *
.To get rid of your errors, change your function to return
void *
, and pass it without type-casting it. The return from the thread function can be a simplereturn NULL
if you don't care about the value.