2017-06-19 1175 views
0

我想建立一個unordered_map併發訪問從一個作家和多個讀取線程。作者只會插入一對,不會刪除或更新插入的任何內容。這一個線程安全嗎?我可以將插入操作視爲原子操作嗎?我在我的代碼上運行了多個測試,沒有發現崩潰或不正確的結果。C++:一個作家/多讀者訪問unordered_map線程安全嗎?

Thx!

+0

不,這不安全。您需要某種鎖定來防止作者和讀者同時訪問地圖。標準庫容器上的任何操作都不是原子操作。 –

回答

3

不,這不是線程安全的。在修改它時,您必須確保沒有人閱讀unoredered_map。例如,如果由於insert導致地圖需要重新映射,那麼您可以嘗試讀取正在修改的數據,即使它是不同的元素。

對此的規則是:如果共享的數據由多個線程訪問,並且其中至少有一個是作者,則必須具有同步。


這並不是說您需要在閱讀時屏蔽所有讀者。您可以使用std::shared_mutex以允許多個閱讀器同時閱讀,但當作者需要編寫時,它會阻止所有閱讀器。

1

如果您正在討論標準的unordered_map,那麼根據C++標準:任何對STL集合的讀取訪問都是線程安全的。寫入操作不是線程安全的。如果你混合使用讀寫操作,它也不是線程安全的。