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