當線程正在退出時(在其析構函數中)是否有一種自動釋放線程持有的互斥鎖的萬無一失的方法?當線程析構函數運行時自動釋放互斥鎖
我一直在採取的方法是爲每個互斥體創建一個結構,這個互斥體持有保存它的線程的身份,然後在析構函數中掃描這個列表,並且如果任何互斥體匹配正在完成的線程,然後釋放它。但我認爲這實際上有一個競爭條件:如果在鎖定互斥鎖之後但在設置數據結構之前調用析構函數,會發生什麼?
我也看了一下pthread_mutexattr_setrobust_np,但我的理解是np函數是不可移植的,並且我在過去遇到過問題。
作爲參考,每個線程都與TCP/IP連接相關聯,並且響應於通過此連接的請求發生鎖定/解鎖。如果連接異常關閉,我需要清理,即釋放所有的鎖。
「但我在想這實際上有一個競爭條件:如果在鎖定互斥鎖之後但在設置數據結構之前調用析構函數,會發生什麼? - 這聽起來像你已經有一個競爭條件,甚至在試圖添加跟蹤到互斥體之前。如果你在一個對象上調用一個析構函數而另一個線程正在使用這個對象,那麼就有問題了。 – 2012-07-30 20:24:10
好吧,如果我在pthread_mutex_lock中的線程上調用pthread_kill,那麼在析構函數中鎖將被保持或不被獲取,因爲獲取鎖是一個原子操作。 – Michael 2012-07-30 20:56:13