2010-11-05 95 views
7

可能重複:
Is the C++ STL std::set thread-safe?
Thread safety for STL queue正在使用std :: deque或std :: priority_queue線程安全嗎?

我猜測它是不是,我只是想確認一下。 含義2線程使用相同 std :: deque使用std::deque::push_backpush_front在同一時間。

同樣的問題也適用於std::priority_queue和功能std::priority_queue::pushstd::priority_queue::pop ..

是這些容器線程安全的?或者我應該親自將其編程爲線程安全的?

Tnx很多。

+0

可能的重複 - http:// stackoverflow。com/questions/1362110/is-the-c-stl-stdset-thread-safe – DumbCoder 2010-11-05 12:46:29

回答

10

斯科特邁爾的Effective STL項目12.有關於STL容器

多的讀者都是安全的線程安全現實的期望。多個線程可能會同時讀取單個容器的內容,並且這可以正常工作。當然,在閱讀過程中不得有任何作家在容器上作出行動。

不同容器的多個作者是安全的。多個線程可能會同時寫入不同的容器。

當涉及到線程安全和STL容器時,您可以希望實現一個庫實現,允許一個容器上的多個閱讀器和多個閱讀器在不同容器上的多個閱讀器。你不能希望庫去消除手動併發控制的需要,你根本不能依賴任何線程支持。

+5

「希望」不是我希望在期望線程安全時看到的一個詞;) – 2014-03-06 10:52:55

+1

這個引用可能與哲學相關,沒有任何實用性的暗示。據我所知,任何stl deque實現我知道這也是不正確的RE閱讀和寫作。 – easytiger 2014-05-21 09:41:04

2

STL不爲線程安全提供任何保證。當從多個線程修改相同的容器時尤其如此。

您正在使用的STL的實現可能會提供一定程度的線程安全性,但您需要查看實現的文檔。

1

當你說他們是線程安全的,可能你的意思是你可以在多線程中使用它們而不必鎖定任何東西。

push_back和push_front不會使std :: deque中的迭代器無效,所以你可能有2個線程,一個推到後面,一個推到前面,你可能會逃脫,但我會保持警惕,因爲實現者不能保證它能夠線程安全,並且可以執行一些不是線程安全的內部內容。

std :: priority_queue幾乎肯定不能在兩個線程中一起使用,大概是對於生產者/消費者線程,只需一次推送和一次彈出,您需要首先鎖定。

我發現當我編寫基於std :: deque的生產者/消費者隊列時,我允許生產者一次推送多個項目,並且消費者掃描整個隊列進行處理。

相關問題