2012-07-08 134 views
0

我有一個問題:是std :: map和std :: set線程安全嗎?我在我的多線程應用程序中使用這些集合,有時映射並設置作品worng。是std :: map和std :: set線程安全嗎?

謝謝!

upd。我的代碼:

std::map<int, unsigned long> ClientTable; 

int sendulong(int socket, char * data) //<--- Many threads uses this function 
{ 
    write(socket, ClientTable[socket]); //<--- ClientTable[[socket] <-- using of map 
} 

我怎麼能解決線程安全的代碼? 謝謝!

+0

代碼*錯*。寫入的調用有太多的'[',並且缺少'size'參數。在談論多線程時,您應該清楚操作的組合是什麼。尤其是所有線程是否只是讀取,或者可能有線程同時寫入容器。 – 2012-07-08 11:43:12

+0

@DavidRodríguez-dribeas。感謝您的回答。我的組合:一個線程是編寫的,一個是線程閱讀的平均值。什麼多線程方案會很好?我沒有多線程編程經驗( – Robert 2012-07-08 11:47:26

+0

[我需要保護對多線程環境中STL容器的讀訪問嗎?](http://stackoverflow.com/questions/187583/do-i-need-to -protect-read-access-to-stl-container-in-a-multithreading-environ) – 2012-07-08 12:41:22

回答

3

C++標準對此沒有任何說明1您必須查看您正在使用的標準庫的特定實現的文檔。但它很可能不會是線程安全的,因此您需要自己進行同步。

(如果你想知道如何做到這一點,好,這是一個不同的問題的主題......)


1.預C11。

+3

C++ 11給出了容器的數據爭用要求,參見23.2.2節,這在庫之前基本上是標準的,因爲它是唯一的合理選擇 – 2012-07-08 14:00:52

3

不,它們沒有被定義爲線程安全的。您必須在標準庫容器之上添加同步機制。

6

這取決於你想要做什麼。如果你所做的只是從他們那裏讀取,那麼是的。如果你也寫信給他們,並且一個單獨的線程試圖做其他事情,或者有活着的迭代器,它將無法按預期工作。

+2

你必須在_修改容器結構_和_修改container_中的項目之間分開。通常,您可以同時修改容器中的兩個不同元素,而不會引入數據競爭。 – 2012-07-08 14:01:53

相關問題