在退出之前,我按以下顺序从main()
致电:
pthread_cancel()
其他主题使用mtx
等待"等待" (他们正在等待其他 cond_variable和互斥。也许这就是问题? pthread_cond_destroy(&cnd)
("耦合"联合mtx
)pthread_mutex_unlock(&mtx)
pthread_mutex_destroy(&mtx)
但是,最后一个函数会生成EBUSY
。每次另一个线程使用互斥锁时,它几乎会立即释放它。另外,如上所述,在尝试销毁互斥锁之前,我会杀死所有这些线程。
为什么会这样?
答案 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()
来避免这一切,但实现一个正确的设计,以明确定义的方式结束所有线程。