我在C中有以下代码:
pthread_cleanup_push(pthread_mutex_unlock, &mutex);
然而,当我编译它时,我收到以下警告:
warning: initialization from incompatible pointer type
怎么了?看起来清理处理程序应该返回void *,而不是int。有没有办法绕过这个警告而不编写额外的包装器?
答案 0 :(得分:5)
表达式pthread_mutex_unlock
没有类型void (*)(void *)
。你需要把它包起来:
static void cleanup_unlock_mutex(void *p)
{
pthread_mutex_unlock(p);
}
并将此函数的地址传递给pthread_cleanup_push
。
其他人可能会建议你施展pthread_mutex_unlock
,但这是不正确和不安全的。它将导致函数通过指向错误函数类型的指针调用,从而导致未定义的行为。