2009-09-10 461 views

回答

4

沒有一個是我知道的,最接近的是其中有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); 
    } 
}; 
0

我所能想到的就是使用OpenMP進行並行化,從std派生出一個set類,並在每個批評集操作周圍放置一個shell,使用#pragma omp critical聲明操作至關重要。

+0

我不認爲你應該從std容器派生。他們沒有虛擬析構函數。在這種情況下,構圖會更好。 – 2009-09-10 13:29:41

0

Qt的QSet類使用隱式共享(copy on write semantics)和類似的方法與std :: set,你可以看看它的實現,Qt是lgpl。

1

你也可以看看ACE庫,它有你可能需要的所有線程安全容器。

3

爲什麼不只是使用共享互斥體來保護併發訪問?一定要使用RAII鎖定和解鎖互斥:

{ 
    Mutex::Lock lock(mutex); 
    // std::set manipulation goes here 
} 

其中互斥鎖::是鎖定在構造函數中的互斥體和解鎖它在析構函數的一類,和互斥是共享的互斥對象由所有主題。互斥體只是一個包裝類,隱藏你正在使用的任何特定的操作系統原語。

我一直認爲併發和集合行爲是正交的概念,所以最好讓它們在不同的類中。根據我的經驗,嘗試自己線程安全的類不是非常靈活或者非常有用。

0

線程安全性和寫入語義上的拷貝不是一回事。這就是說...

如果你真的在寫時複製語義之後,Adobe Source Libraries有一個copy_on_write模板,它將這些語義添加到任何實例化它的任何東西。

1

您不需要內部鎖定,因爲您的不變量通常需要對數據結構進行多個操作,並且內部鎖定只能防止這些步驟同時發生,而您需要保留來自不同宏觀操作的步驟來自交錯。