线程析构函数运行时自动释放所持有的互斥



有没有一种万无一失的方法可以在线程退出(在其析构函数中)时自动释放该线程持有的互斥体?

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

我也研究过pthread_mutexattr_setrobust_np,但我的理解是np函数是不可移植的,我过去也有过这样的问题。

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

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

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

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

最新更新