0

当线程退出(在其析构函数中)时,是否有一种万无一失的方法来自动释放线程持有的互斥锁?

我一直在采取的方法是为每个互斥体创建一个结构,该结构体持有持有它的线程的身份,然后在析构函数中扫描这个列表,如果有任何互斥体与正在完成的线程匹配,然后释放它。但我认为这实际上有一个竞争条件:如果在我锁定互斥锁之后但在我设置数据结构之前调用析构函数会发生什么?

我还查看了 pthread_mutexattr_setrobust_np,但我的理解是 np 函数是不可移植的,我过去曾遇到过问题。

作为参考,每个线程都与一个 TCP/IP 连接相关联,并且锁定/解锁是响应此连接上的请求而发生的。如果连接异常关闭,我需要清理,即释放所有持有的锁。

4

1 回答 1

0

我找到了一个似乎可行的解决方案。首先,我使用错误检查互斥锁(PTHREAD_ERRORCHECK_MUTEX_INITIALIZERPTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)。

接下来,在析构函数中,我尝试解锁所有互斥锁,其想法是任何不属于线程的互斥锁都将被单独保留,但线程拥有的任何互斥锁都将被释放。

由于某种原因,即使线程拥有的互斥锁也会返回 EPERM,但随后尝试从另一个线程重新锁定互斥锁会成功,而如果不尝试解锁另一个尝试,则会死锁。相反,在析构函数运行后,仍然会发现不属于被析构线程的其他互斥锁被锁定。

于 2012-07-30T22:24:14.130 回答