使用pthread_mutex_unlock进行pthread_cleanup_push

Seb*_*wak 1 c mutex pthreads

我在C中有以下代码:

pthread_cleanup_push(pthread_mutex_unlock, &mutex);
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,我得到以下警告:

warning: initialization from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

怎么了?看起来清理处理程序应该返回void*,而不是int.有没有办法绕过这个警告,而无需编写额外的包装器?

R..*_*R.. 6

表达式pthread_mutex_unlock没有类型void (*)(void *).你需要包装它:

static void cleanup_unlock_mutex(void *p)
{
    pthread_mutex_unlock(p);
}
Run Code Online (Sandbox Code Playgroud)

并将此函数的地址传递给pthread_cleanup_push.

其他人可能会建议你施展pthread_mutex_unlock,但这是不正确和不安全的.它将导致函数通过指向错误函数类型的指针调用,从而导致未定义的行为.