10
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

4 回答 4

17

如果您查看手册页,您会看到函数参数是

void *(*start_routine) (void *)

也就是说,指向一个函数的指针,该函数接受一个void *参数并返回void *

要摆脱错误,请将函数更改为 return void *,并在不进行类型转换的情况下传递它。return NULL如果您不关心值,则线程函数的返回可能很简单。

于 2012-08-01T11:25:07.897 回答
4

(void *) &functionA会将您的函数指针functionA类型 void (*)(void*)转换为简单的void*. 后者不能再转换为第一个,所以编译器报错。这是您不应该使用 C 风格强制转换的原因之一。

改为使用pthread_create (&A, NULL, functionA, NULL);

此外,线程函数的返回类型应该是void*,而不是void。所以void functionA(void*)改为void* functionA(void*).

于 2012-08-01T11:23:20.333 回答
4

采用

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

而不是铸造。

此外,您用来传递给 pthread_create 的函数应该返回一个void*so 以避免以后出现任何问题,请考虑更改函数签名以适应这一点。

于 2012-08-01T11:27:39.760 回答
3

当您使用 C++ 编译器时,您应该使用带有 C 绑定的函数,因为 pthread_create 需要一个 C 函数:

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

C++ 和 C 在您当前的平台上可能具有相同的调用约定,但不能保证在其他平台上会是这种情况,或者将来会是这样。

于 2012-08-01T11:39:58.030 回答