error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ - pthreads

匿名 (未验证) 提交于 2019-12-03 03:09:01

问题:

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);     } } 

回答1:

If you look at the manual page you will see that the function argument is

void *(*start_routine) (void *) 

That is, a pointer to a function which takes one void * argument and returns void *.

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 simple return NULL if you don't care about the value.



回答2:

(void *) &functionA will cast your function pointer functionA which is of type void (*)(void*) to a simple void*. 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*, not void. So change void functionA(void*) to void* functionA(void*).



回答3:

And as you are using a C++ compiler, you should use a function with C binding, as pthread_create expects a C function:

extern "C" void* functionA (void*); 

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.



回答4:

Use

pthread_create (&A, NULL, functionA, NULL);  

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.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!