【问题标题】:Why do I get EBUSY when trying to pthread_mutex_destroy?为什么我在尝试 pthread_mutex_destroy 时会得到 EBUSY?
【发布时间】:2016-05-22 09:04:10
【问题描述】:

就在退出之前,我按以下顺序从main() 呼叫:

  1. pthread_cancel() 其他线程使用 mtx 正在“等待”(他们正在等待其他 cond_variable 和 mutex。也许这就是问题所在?
  2. pthread_cond_destroy(&cnd)(与mtx“耦合”)
  3. pthread_mutex_unlock(&mtx)
  4. pthread_mutex_destroy(&mtx)

但是,最后一个函数的结果是EBUSY。每次另一个线程使用互斥体时,它几乎都会立即释放它。另外,如前所述,我在尝试销毁互斥体之前杀死了所有这些线程。

为什么会这样?

【问题讨论】:

  • 为什么只在一个线程上使用互斥锁?也许只是为了放慢速度!
  • @EdHeal,请参阅编辑。
  • 被取消运行的线程是否分离?如果没有,代码是否加入了他们?
  • 有没有更优雅的方式来终止线程而不是杀死它们
  • 我不加入他们,因为他们表现得像工人一样,当队列为空时会进入睡眠状态。

标签: c multithreading posix


【解决方案1】:

根据man pthread_mutex_destroy

如果出现以下情况,pthread_mutex_destroy() 函数可能会失败:

实现检测到试图破坏互斥锁所引用的对象,而它被锁定或引用(例如, 在 pthread_cond_timedwait() 或 pthread_cond_wait() 中使用时 由另一个线程。

在尝试销毁互斥锁​​时,检查互斥锁是否未被其他线程使用。

【讨论】:

  • 好的,实际上我确实在另一个线程中使用了mtx,但是当我这样做时,我也在发出信号后立即解锁。而且,我之前取消了所有这些线程,所以我真的不知道为什么会这样......
【解决方案2】:

pthread_cancel() 其他线程使用正在“等待”的 mtx(它们正在等待其他 cond_variable 和 mutex。

取消与取消进程异步运行,即pthread_cancel() 很可能在要取消的线程结束之前返回。

这会导致线程使用的资源(互斥体、条件等)被取消,之后立即调用pthread_mutex_destroy() 时可能仍在使用中。

测试取消是否成功的唯一方法是在取消的线程上调用pthread_join()并期望它返回PTHREAD_CANCELED。这意味着要取消的线程没有分离。

在这里,您会看到取消线程的一个可能问题。还有其他的。只需通过不使用pthread_cancel() 来避免这一切,而是实施适当的设计,以明确定义的方式结束所有线程。

【讨论】:

    猜你喜欢
    • 2014-07-08
    • 2020-05-04
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-10-23
    • 2015-10-24
    • 2019-11-12
    • 1970-01-01
    相关资源
    最近更新 更多