当该线程退出时(在其析构函数中)是否存在一种自动释放线程持有的互斥锁的简单方法?
我一直在采用的方法是为每个互斥锁创建一个结构,该结构包含保存它的线程的标识,然后在析构函数中扫描该列表,如果任何互斥锁与正在完成的线程匹配,则释放然后呢。但我认为这实际上有一个竞争条件:如果在我锁定互斥锁之后但在设置数据结构之前会调用析构函数会发生什么?
我也看过pthread_mutexattr_setrobust_np,但我的理解是np函数是不可移植的,我以前遇到过这个问题。
作为参考,每个线程都与TCP / IP连接相关联,并且响应通过此连接的请求而发生锁定/解锁。如果连接异常关闭,我需要清理,即释放所有锁。
答案 0 :(得分:0)
我找到了一个似乎有效的解决方案。首先,我使用错误检查互斥锁(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER
或PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
)。
接下来,在析构函数中,我尝试解锁所有互斥锁,其中的想法是线程不拥有的任何互斥锁将被单独保留,但线程拥有的任何互斥锁都将被释放。
由于某些原因,即使该线程拥有的互斥锁返回EPERM,但随后尝试从另一个线程重新锁定互斥锁成功,而不尝试解锁另一次尝试将导致死锁。相反,在析构函数运行后,仍然发现其他非破坏线程所拥有的互斥锁被锁定。