(void(*)(void*)的含义)

Kon*_*tin 5 c++ multithreading casting

你能解释一下我(void (*)(void *))在下面的表达式中的含义是什么:

(void (*)(void *))pthread_mutex_unlock
Run Code Online (Sandbox Code Playgroud)

And*_*rew 4

外括号表示强制转换。这些括号内的内容是要转换的类型。

在这种情况下,它是一个指向函数的指针(*),接受一个void*参数,然后返回void(即什么也不返回)。

它在这里用于强制转换pthread_mutex_unlock,其签名为

int pthread_mutex_unlock(pthread_mutex_t*);
Run Code Online (Sandbox Code Playgroud)

这样它就可以与需要该类型函数的东西一起使用(例如,作为回调)

void function(void*);
Run Code Online (Sandbox Code Playgroud)

请注意,这样做是否明智在很大程度上取决于目标平台。用另一个具有正确签名的函数包装该函数会更安全(即更便携)

void pthread_mutex_unlock_wrapper(void *mutex)
{
    pthread_mutex_unlock((pthread_mutex_t*)mutex);
}
Run Code Online (Sandbox Code Playgroud)

这将执行强制转换为参数类型pthread_mutex_unlock并丢弃返回类型。这避免了由于调用者和被调用者对参数和返回值的空间要求有不同的理解而导致堆栈损坏的可能性(尽管在实践中这可能很少成为被忽略的返回值的问题,但最好还是安全一点) )。

尾注:

最后一点,由于您将问题标记为 C++,因此您可以将(pthread_mutex_t*)mutex包装函数中的强制转换替换为static_cast<pthread_mutex_t*>(mutex),它执行等效的转换,但可以更容易地阅读和理解为强制转换。如果你真正使用 C++,你应该更喜欢这些“C++ 风格”的强制转换,因为它们具有明确定义的语义(即,你可以做什么static_cast、你可以做什么dynamic_cast等等),并且在阅读时更容易发现它们代码。