【发布时间】:2012-07-30 19:38:30
【问题描述】:
当线程退出(在其析构函数中)时,是否有一种万无一失的方法来自动释放线程持有的互斥锁?
我一直采取的方法是为每个互斥体创建一个结构,该结构体持有持有它的线程的身份,然后在析构函数中扫描此列表,如果有任何互斥体与正在完成的线程匹配,则释放那么它。但我认为这实际上有一个竞争条件:如果在我锁定互斥锁之后但在我设置数据结构之前调用析构函数会发生什么?
我还查看了 pthread_mutexattr_setrobust_np,但我的理解是 np 函数是不可移植的,我过去曾遇到过这样的问题。
作为参考,每个线程都与一个 TCP/IP 连接相关联,并且锁定/解锁是为了响应此连接上的请求而发生的。如果连接异常关闭,我需要清理,即释放所有持有的锁。
【问题讨论】:
-
“但我认为这实际上有一个竞争条件:如果在我锁定互斥体之后但在我设置数据结构之前调用析构函数会发生什么?” - 那么听起来你甚至在尝试向互斥体添加跟踪之前就已经有了竞争条件。如果您在对象上调用析构函数,而它可能正在另一个线程上使用,则会出现问题。
-
好吧,如果我在 pthread_mutex_lock 中的线程上调用 pthread_kill,在析构函数中,锁将被持有或不持有,因为获取锁是原子操作。