我在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,但这是不正确和不安全的。它将导致通过指向错误函数类型的指针调用函数,从而导致未定义的行为。

07-24 09:46
查看更多