2012-02-14 87 views
1

可能重複:
question about STL thread-safe and STL debugging爲什麼C++ STL不提供一組線程安全的容器?

我目前正在從事這是用C++開發的一個項目。最近我們正在考慮用一些STL等價物替換一些自定義的線程安全容器來獲得一些效率。

但是,經過一段時間後,我發現STL中並沒有提供一個線程安全的容器,這個容器有很多驚喜。有什麼理由嗎?

+7

線程甚至不是C++的一部分,直到0x。因此沒有容器。 – Anycorn 2012-02-14 09:16:06

+0

非正式地說,在大多數實現中'operator new'是線程安全的。所以至少該部分可以保證在STL中是線程安全的。此外,所有的STL容器都有一個用於分配的'template'參數(通常是'std :: allocator'),您始終可以提供您自己的線程安全分配方法。 – iammilind 2012-02-14 09:25:27

回答

2

由於線程安全性高度平臺和編譯器特定。

+1

爲什麼&如何阻止標準實施線程安全要求?實施的責任是遵守針對其發佈的每個平臺的標準指定要求。 – 2012-02-14 10:03:08

5

可能是因爲它實際上並不是那麼有用(除了@Luchian Grigore在另一個答案中所說的)。即使單個容器操作是線程安全的,您仍然需要做大量工作來確保線程安全。舉例來說,這個簡單的代碼包含即使容器本身是線程安全的競爭條件:

if (!container.empty()) 
    container.pop(); 
+1

線程安全的容器會提供'blocking_pop'和'pop_if_not_empty'。 – fredoverflow 2012-02-14 10:05:19

4

標準庫容器提供了一些基本的線程安全,性能是一個比較重要的設計目標爲標準庫的設計者容器比安全。

所有標準庫容器保證:
多個併發來自同一個容器中讀取是安全的,但
如果有ATLEAST一個作家線程,那麼就沒有線程安全&不得有任何其他作家或閱讀器。

標準庫容器主要設計用於在單線程環境中高效地工作,並且只提供基本的線程安全性,以確保不需要併發訪問的容器的完全性能。

基本的線程安全需要用戶需要某種同步方法來避免使用互斥鎖或鎖的競爭條件。鎖定或其他形式的同步通常很昂貴,因此在不必要時需要避免。

另外,考慮到標準庫容器公開的接口,容器的客戶端或用戶很容易提供必要的鎖定,方法是將鎖定獲取和釋放包裝在底層容器操作中,如果打算使用多個線程環境。


注意,所有的實現符合由C++標準規定的以下要求:

17.6.3.10共享對象和庫[res.on.objects]

的如果對來自不同線程的標準庫函數的調用可能引入數據競爭,則程序的行爲是不確定的。可能發生這種情況的條件在17.6.4.8中規定。 [注意:修改線程之間共享的標準庫類型的對象可能會導致未定義的行爲,除非該類型的對象被明確指定爲可在沒有數據競爭的情況下共享,或者用戶提供鎖定機制。末端注]

1

的C++ STL提供了一種線程安全的是幾乎一切提供:您可以放心地使用STL容器從多個線程,只要對象不而另一個線程訪問線程正在或可能正在對其進行修改。

0

一句話 - 因爲很難。因爲線程安全的容器需要特定的設計 - 例如,他們必須是persistent data structures。這種容器最容易在功能/垃圾收集/基於事件的環境中實現。哪個C++不是。

也就是說,實現這些仍然需要用戶處理所有的資源分配/釋放。這種方式打破了收藏這一點。