2016-03-03 36 views
1

我稱爲一個線程,然後我想解開互斥在另一個線程pthread_mutex_unlock(&th)和的pthread_mutex_lock的pthread_mutex_lock在另一個線程

是否有可能做一個pthread_mutex_lock(&th)

或者互斥鎖應該在同一個線程中解鎖?

+0

不要那樣做。你需要重新考慮你的算法。可能嘗試使用信號量。 – wilx

+1

'或者應該在同一個線程中解鎖互斥鎖?'不,互斥量必須由相同的線程解鎖。 –

回答

2

我只是想添加到Guijt的回答: 當一個線程鎖定一個互斥鎖時,它被認爲是在一個臨界區內。如果我們允許另一個線程解鎖該互斥鎖,那麼第一個線程可能仍在關鍵部分內,導致問題。

我可以看到幾個解決方案,您的問題:

選項1:重新考慮你的算法

試着去理解爲什麼你需要從不同的線程解鎖,看看你是否能得到解鎖在鎖定線程內完成。這是最好的解決方案,因爲它通常會生成最容易理解的代碼,並且最簡單的方法就是證明它實際上正在做您認爲正在做的事情。由於多線程編程非常複雜,因此這種簡單性所付出的代價應該相當高。

選項2:與事件

可能有人會說,這只是實現上面的選項1的方法同步的線程。這個想法是,當鎖定線程完成關鍵部分時,它不會出去做任何事情,而是等待一個事件。當第二個線程想要釋放鎖定時,它反而表示該事件。第一個線程然後釋放鎖。

此過程的優點是線程2不會無意中很快釋放鎖。

選項3:不要使用互斥

如果上述選項沒有一個爲你工作,你最有可能使用的不是相互排斥的互斥體,但同步。如果是這樣的話,你可能會使用錯誤的結構。

最類似互斥體的構造是一個信號量。實際上,多年來Linux內核沒有互斥體,聲稱它只是一個最大值爲1的信號量。與互斥體不同,信號量不需要相同的線程鎖定和釋放。

RTFM在sem_init和朋友如何使用它。

請注意,您必須首先爲您的問題建模,然後才能選擇正確的同步結構來使用。如果反過來這樣做,幾乎肯定會引入很多真的很難找到並修復的錯誤。

0

使用Mutex的完整目的是在內核跟蹤所有權的關鍵部分實現互斥。所以互斥體必須在獲得它的同一線程中解鎖

相關問題