2010-10-18 37 views
2

例如,如果互斥鎖不能適應多線程訪問(例如,兩個同時調用mutex.lock()不能解決問題),多線程將無法工作。如何知道我需要使用boost在C++中使用鎖來保護哪些共享變量?

這是否擴展到條件變量呢?具體來說,我想釋放一個鎖,然後調用cond.notify_one()。理論上,另一個線程可以在通知之前獲取鎖,然後開始自己調用cond.notify_one()。有沒有保證這會表現良好?

怎麼樣在堆上分配簡單的數據結構?假設數據結構保證不會在讀取時自行調整,那麼在只讀數據結構的情況下允許併發訪問是否可行?是否有stl數據結構和成員函數允許併發讀取而不需要鎖定的文檔?

回答

6

您需要訪問同步到

  1. 對象使用一個以上的線程和
  2. 至少是一個線程可以修改對象的任何對象。

有多種方法可以做同步:鎖(互斥鎖)和原子可能是兩個最常用的,儘管有一些數據結構的無鎖實現。

是否有STL數據結構和成員函數允許併發讀取而不需要鎖定的文檔?

任何const限定的成員函數都應該可以安全地調用。

香草薩特寫了a whole series of articles on Effective Concurrency,你可能會發現有用的。他討論了各種設計模式,常見陷阱,鎖定層次結構和其他併發性主題。

2

它是確定允許併發訪問,如果數據結構只被讀

是。只讀訪問可以從來沒有生成多線程衝突。

1

互斥鎖和條件變量是「多線程工具鏈」的一部分,用於實現多線程應用程序。因此,它們被定義爲「線程安全」。

具體來說,我想釋放一個鎖,然後調用cond.notify_one()。理論上,另一個線程可以在通知之前獲取鎖,然後開始自己調用cond.notify_one()。有沒有保證這會表現良好?

在這種情況下,您希望通過持有互斥鎖來操作條件變量,以避免這種競爭條件。

如何在堆上分配簡單的數據結構?

可以同時安全地訪問簡單的(如在字節緩衝區或C風格結構中)。任何變異對象都需要同步。

是否有文檔的stl數據結構和成員函數允許併發讀取而不需要鎖定?

據我所知,標準C++庫包通常不是線程安全的。

0

理論上,另一個線程可以在通知之前抓住鎖,並開始它自己對cond.notify_one()的調用。有沒有保證這會表現良好?

您通常讓其它線程等待條件,而不是鎖,但如果你這樣做,然後,抓住搶奪鎖和信號線鎖將防止胎面的條件被喚醒的線程會不是一個繼續,而是等待鎖定。

這是典型的使用模式:Boost Conditions

+1

如果你要描述這樣的技術術語使用代碼它比英語更精確。我不得不三次讀這句話,我仍然不確定你的意思。 – 2010-10-18 20:31:16

相關問題