错误:从“void *”到“void *(*)(void *)”的转换无效 - pthreads

12
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*)’
第33行是这个:
pthread_create (&A, NULL, (void *) &functionA, NULL);

functionA的声明如下:

void functionA(void*);


它的定义是:

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);
    }
}
4个回答

18

如果您查看手册页面,您将看到函数参数为

void *(*start_routine) (void *)
也就是说,指向一个接受一个void指针参数并返回void指针的函数的指针。为了消除错误,将您的函数更改为返回void*,并在不进行类型转换的情况下传递它。如果您不关心值,则线程函数的返回可以是简单的return NULL。

1
很抱歉我没有查看手册。我按照这个链接:http://www.amparo.net/ce155/thread-ex.html,但是出现了错误。 - Aquarius_Girl
如果您遇到有关函数参数的编译错误,则查看该函数的手册页面以确保正确使用参数可能会有所帮助。@AnishaKaul - Some programmer dude

4

使用

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

使用类型转换的方法不如直接传递参数。

同时,你用于传递给pthread_create的函数应该返回一个void*,为了避免以后出现任何问题,请考虑更改函数签名以适应此要求。


4

(void *) &functionA将把您的函数指针functionA从类型void (*)(void*)转换为简单的void*。后者无法再次转换为前者,因此编译器会报错。这是不应使用C风格强制转换的原因之一。

请改用 pthread_create (&A, NULL, functionA, NULL);

此外,线程函数的返回类型应为void*,而不是void。因此,请将void functionA(void*)更改为void* functionA(void*)


错误:从'void ()(void)'到'void* ()(void)'的转换无效。 - Aquarius_Girl
1
更一般地说,void*是指向数据的指针,void (*)(void*)是指向函数的指针。这两种类型之间没有合法的转换。 - James Kanze

3

由于您使用的是C++编译器,因此应使用具有C绑定的函数,因为pthread_create需要一个C函数:

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

C++和C在当前平台上可能具有相同的调用约定,但不能保证在其他平台上或将来也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接