尝试pthread_mutex_destroy时为什么要获得EBUSY?

时间:2016-05-22 09:04:10

标签: c multithreading posix

在退出之前,我按以下顺序从main()致电:

  1. pthread_cancel()其他主题使用mtx等待"等待" (他们正在等待其他 cond_variable和互斥。也许这就是问题?
  2. pthread_cond_destroy(&cnd)("耦合"联合mtx
  3. pthread_mutex_unlock(&mtx)
  4. pthread_mutex_destroy(&mtx)
  5. 但是,最后一个函数会生成EBUSY。每次另一个线程使用互斥锁时,它几乎会立即释放它。另外,如上所述,在尝试销毁互斥锁​​之前,我会杀死所有这些线程。

    为什么会这样?

2 个答案:

答案 0 :(得分:2)

根据man pthread_mutex_destroy

  

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

     

<强> EBUSY       实现已检测到在锁定或引用互斥锁时,会尝试销毁互斥锁​​引用的对象(例如,   在pthread_cond_timedwait()或pthread_cond_wait()中使用时   另一个主题。

当您尝试销毁互斥锁​​时,检查互斥锁是否未使用该互斥锁。

答案 1 :(得分:1)

  

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

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

这会导致线程使用的资源(互斥,条件......)在之后立即调用pthread_mutex_destroy()时可能仍在使用。

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

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