我稱爲一個線程,然後我想解開互斥在另一個線程pthread_mutex_unlock(&th)
和的pthread_mutex_lock的pthread_mutex_lock在另一個線程
是否有可能做一個pthread_mutex_lock(&th)
?
或者互斥鎖應該在同一個線程中解鎖?
我稱爲一個線程,然後我想解開互斥在另一個線程pthread_mutex_unlock(&th)
和的pthread_mutex_lock的pthread_mutex_lock在另一個線程
是否有可能做一個pthread_mutex_lock(&th)
?
或者互斥鎖應該在同一個線程中解鎖?
它應該在同一個線程中解鎖。從手冊頁:「如果線程試圖解鎖未鎖定的互斥鎖或未鎖定的互斥鎖,則會導致未定義的行爲。」 (http://pubs.opengroup.org/onlinepubs/009604499/functions/pthread_mutex_lock.html)
我只是想添加到Guijt的回答: 當一個線程鎖定一個互斥鎖時,它被認爲是在一個臨界區內。如果我們允許另一個線程解鎖該互斥鎖,那麼第一個線程可能仍在關鍵部分內,導致問題。
我可以看到幾個解決方案,您的問題:
選項1:重新考慮你的算法
試着去理解爲什麼你需要從不同的線程解鎖,看看你是否能得到解鎖在鎖定線程內完成。這是最好的解決方案,因爲它通常會生成最容易理解的代碼,並且最簡單的方法就是證明它實際上正在做您認爲正在做的事情。由於多線程編程非常複雜,因此這種簡單性所付出的代價應該相當高。
選項2:與事件
可能有人會說,這只是實現上面的選項1的方法同步的線程。這個想法是,當鎖定線程完成關鍵部分時,它不會出去做任何事情,而是等待一個事件。當第二個線程想要釋放鎖定時,它反而表示該事件。第一個線程然後釋放鎖。
此過程的優點是線程2不會無意中很快釋放鎖。
選項3:不要使用互斥
如果上述選項沒有一個爲你工作,你最有可能使用的不是相互排斥的互斥體,但同步。如果是這樣的話,你可能會使用錯誤的結構。
最類似互斥體的構造是一個信號量。實際上,多年來Linux內核沒有互斥體,聲稱它只是一個最大值爲1的信號量。與互斥體不同,信號量不需要相同的線程鎖定和釋放。
RTFM在sem_init和朋友如何使用它。
請注意,您必須首先爲您的問題建模,然後才能選擇正確的同步結構來使用。如果反過來這樣做,幾乎肯定會引入很多真的很難找到並修復的錯誤。
使用Mutex的完整目的是在內核跟蹤所有權的關鍵部分實現互斥。所以互斥體必須在獲得它的同一線程中解鎖
不要那樣做。你需要重新考慮你的算法。可能嘗試使用信號量。 – wilx
'或者應該在同一個線程中解鎖互斥鎖?'不,互斥量必須由相同的線程解鎖。 –