2012-02-23 41 views
0

我想實現一個互斥鎖。 從我的理解,mutex.lock()應該像 1)檢查鎖的所有者 2)如果鎖被擁有,把線程等待隊列 3)暫停本線程,直到另一個線程發送最多等待信號暫停pthread?

然而,沒有什麼像pthread_suspend()那麼我該如何掛起? 我發現有人說使用pthread_con_wait(),但似乎如果我想使用該功能,我必須首先設置一個pthread_mutex鎖,這是沒有意義的,我的互斥體內使用pthread_mutex。

那麼,如果我對互斥的理解是錯誤的,請糾正我。

謝謝。

回答

0

mutex.lock()應該工作一樣:

1)檢查鎖的所有者 2)如果鎖被擁有,把線程等待隊列 3)暫停本線程,直到擁有鎖的線程發送喚醒信號。沒有其他線程可以釋放鎖。

這些步驟應該原子操作,以便正確的行爲是遵循所有線程獲取/釋放互斥體,無論這樣的電話怎麼可能會被中斷,並從其他線程重新輸入進行。

'然而,沒有什麼像pthread_suspend(),那麼我該如何暫停? - 通常,你沒有。 OS內核提供的同步原語可以阻止不應該運行的線程。要在用戶空間中實現「掛起」,您只能旋轉等待 - 在少數情況下這是一個很好的策略,(鎖定時間很短的多核心框欠載),但肯定會並非全部(並且可能導致整個機器羣集中出現嚴重的災難性活鎖)。

如果你想要一個互斥鎖,使用OS互斥鎖 - 這就是任何跨平臺的庫。會做。

+0

那麼spin-wait check(線程插入到Q後)是什麼?喜歡這個? 「while(lockOwner!= self)」那麼這和自旋鎖之間有什麼區別...... – user956159 2012-02-25 16:50:40

0

你只能做出與最簡單的部分一樣複雜的東西。如果你有最簡單的部分互斥體,那麼你不能從你擁有的部分製作互斥體。你只能使得事物至少像互斥體一樣複雜或更多。如果你的任何部分比互斥體簡單,請告訴我們它們是什麼,我們可以告訴你如何從它們中創建互斥鎖。

我想,如果你願意,你可以使自己的互斥出並行線程互斥體和條件變量。我不確定這一點是什麼,但這是微不足道的。如您所述,您可以使用pthread_cond_wait來等待您自己的互斥量。

原因並行線程標準爲您提供了一個互斥體,因爲它是關於最靈活的可能同步原語。

2

互斥鎖,鎖和等待條件都是不同的,獨特的東西。你需要一個互斥變量,以便實現鎖定和等待條件。

鎖是一種簡單的機制,以防止多於一個的線程從通過使所有由一個線程等待鎖被解鎖一次執行相同的代碼。

甲等待條件是一個稍微較複雜的結構,其允許一個線程來監視的條件(通常是一個布爾標誌),並且僅喚醒當標誌已經有利地改變。

在兩種情況下,當一個線程塊(即休眠)時,操作系統的調度原語自動照顧descheduling線程,並使用可用的計算時間的別處。線程和任務調度不是您通常不必擔心的手動操作。