我正在尋找類似於Java中的CopyOnWriteSet的東西,這是一組支持add
,remove
和某些類型的iterators
的多線程。線程安全C++ std :: set支持多線程中的添加,刪除和迭代器
回答
沒有一個是我知道的,最接近的是其中有concurrent_unordered_map
的STL容器允許concurrent read access from multiple threads只要你不沒有做併發修改線程構建模塊。通常在添加/刪除時不需要重複。
關於提供一個簡單的包裝類的指導是明智的,我會從下面的代碼片段開始,保護您真正需要併發訪問的方法,然後提供對基本std :: set的「不安全」訪問人們可以選擇其他不安全的方法。如果需要,您可以保護訪問以及獲取迭代器並將其放回,但這非常棘手(與編寫自己的無鎖套件或您自己完全同步的套件相比,還要少)。
我對並行模式庫工作,所以我使用CRITICAL_SECTION從VS2010測試版的boost ::互斥的偉大工程太也不管你選擇如何做到這一點使用lock_guard的RAII模式幾乎是必要的:
template <class T>
class synchronized_set
{
//boost::mutex is good here too
critical_section cs;
public:
typedef set<T> std_set_type;
set<T> unsafe_set;
bool try_insert(...)
{
//boost has a lock_guard
lock_guard<critical_section> guard(cs);
}
};
我所能想到的就是使用OpenMP進行並行化,從std派生出一個set類,並在每個批評集操作周圍放置一個shell,使用#pragma omp critical聲明操作至關重要。
Qt的QSet類使用隱式共享(copy on write semantics)和類似的方法與std :: set,你可以看看它的實現,Qt是lgpl。
你也可以看看ACE庫,它有你可能需要的所有線程安全容器。
爲什麼不只是使用共享互斥體來保護併發訪問?一定要使用RAII鎖定和解鎖互斥:
{
Mutex::Lock lock(mutex);
// std::set manipulation goes here
}
其中互斥鎖::是鎖定在構造函數中的互斥體和解鎖它在析構函數的一類,和互斥是共享的互斥對象由所有主題。互斥體只是一個包裝類,隱藏你正在使用的任何特定的操作系統原語。
我一直認爲併發和集合行爲是正交的概念,所以最好讓它們在不同的類中。根據我的經驗,嘗試自己線程安全的類不是非常靈活或者非常有用。
線程安全性和寫入語義上的拷貝不是一回事。這就是說...
如果你真的在寫時複製語義之後,Adobe Source Libraries有一個copy_on_write
模板,它將這些語義添加到任何實例化它的任何東西。
您不需要內部鎖定,因爲您的不變量通常需要對數據結構進行多個操作,並且內部鎖定只能防止這些步驟同時發生,而您需要保留來自不同宏觀操作的步驟來自交錯。
- 1. python迭代器和線程安全
- 2. std ::向量,線程安全,多線程
- 3. 安全迭代由多個線程
- 4. 是std :: map和std :: set線程安全嗎?
- 5. C++線程安全和notify_all()
- 6. ECMAScript 6 Map&Set - 在迭代過程中安全刪除?
- 7. std :: mutex的線程安全
- 8. C++的基於線程的線程安全的std :: cerr
- 9. 線程安全的搜索和添加
- 10. std :: map多線程程序中的讀/寫和刪除
- 11. 成員集合迭代線程安全
- 12. C++中的多線程線程安全動畫建議
- 13. 是std :: ifstream線程安全和無鎖?
- 14. C++多線程:線程安全的內存分配
- 15. C中的線程安全?
- 16. C#線程安全
- 17. C#計時器和線程安全
- 18. 從Set迭代器中刪除
- 19. C++ 11和較新的STL的std ::向量和線程安全
- 20. c中使用線程安全隨機數的多線程
- 21. 支持多線程的arraylist
- 22. 線程安全
- 23. 在.Net中添加和刪除列表項的線程安全方式
- 24. 線程安全多進程
- 25. C#中的線程安全和System.Text.Encoding
- 26. C++線程安全的ssl支持的SOAP客戶端
- 27. 線程安全的持有人
- 28. 線程安全在C中增加#
- 29. 是String get/set線程安全嗎?
- 30. 線程安全集合,支持去除項目
我不認爲你應該從std容器派生。他們沒有虛擬析構函數。在這種情況下,構圖會更好。 – 2009-09-10 13:29:41