【问题标题】:pthread_cleanup_push with pthread_mutex_unlockpthread_cleanup_push 和 pthread_mutex_unlock
【发布时间】:2013-12-21 21:40:58
【问题描述】:

我在 C 中有以下代码:

pthread_cleanup_push(pthread_mutex_unlock, &mutex);

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

warning: initialization from incompatible pointer type

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

【问题讨论】:

  • 这是一个非常明确的警告。你与它的哪一部分斗争?您是否阅读了此处涉及的所有功能的手册?
  • 可能duplicate
  • 你们都错过了实际的问题。
  • 顺便说一句,我不明白所有 -1 是怎么回事......这是一个合理的问题。
  • 有些人只是在回答之前无法阅读整个问题。 Stack Overflow 上典型的一天。

标签: c pthreads mutex


【解决方案1】:

表达式pthread_mutex_unlock 没有void (*)(void *) 类型。你需要把它包装起来:

static void cleanup_unlock_mutex(void *p)
{
    pthread_mutex_unlock(p);
}

并将这个函数的地址传递给pthread_cleanup_push

其他人可能会建议您只投射pthread_mutex_unlock,但这是不正确且不安全的。这将导致函数通过指向错误函数类型的指针被调用,从而导致未定义的行为。

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多