2009-05-04 169 views
13

有誰知道在哪裏可以找到一個包裝STL映射並使其線程安全的implimentation?當我說線程安全時,我的意思是它只提供對地圖的串行訪問,一次只有一個線程。最佳情況下,這張圖應該只使用STL和/或boost結構。C++線程安全映射

回答

11

不符合您指定的標準,但你可以看看在TBB容器。有所謂的concurrent_hash_map,它允許多個線程同時訪問地圖中的數據。有一些細節,但一切都很好記錄,並可以給你一個「併發容器」的想法。根據您的需求,這可能是完全不恰當......

+2

此庫英特爾CPU是否依賴? – 2012-07-07 17:44:24

1

boost shared_mutex將提供最佳的多讀取器/單寫入器方法來包裝給定約束的標準映射。我不知道任何「預先構建」的實現與這兩者結婚,因爲任務通常是微不足道的。

+4

這個任務遠不是微不足道的,至少要做到高效率,這就是爲什麼你不會找到任何實現。 – 2009-05-04 15:19:14

+0

好吧,也許「微不足道」是錯誤的詞。至少在你正在研究的具體情況下(除非你有一些非常具體的要求),這並不難做。 – Joe 2009-05-04 16:56:38

1

這取決於要實施的應用程序。一個「線程安全」的地圖會使地圖中的個別調用成爲線程安全的,但是很多操作需要在線程安全的之間調用。使用該映射的應用程序應該將一個互斥量與該映射相關聯,並使用該互斥量來協調對該映射的訪問。

試圖使線程安全的容器在Java中是一個錯誤,並且這在C++中是一個錯誤。

+7

你能解釋爲什麼製作線程安全的容器是一個錯誤嗎? – einpoklum 2013-12-31 12:36:06

3

集合類提供線程安全性通常不是一個好主意,因爲他們無法知道它們是如何被使用的。通過在使用集合的更高級別構造中實現自己的鎖定機制,您將會得到更好的服務。

+8

爲什麼這不是一個好主意?你能指點我一些文章嗎? 我只是不明白,爲什麼Java,C#/ VB(.NET)和C++都有併發集合的庫,如果他們是個壞主意。這些庫分別是:java.util.concurrent,System.Collections.Concurrent(.NET 4.0)和Intel的線程構建模塊。 是否只是通過使用這些庫來獲得性能優勢?我知道一些集合總是返回一個快照「複製」以進行迭代等,所以我可以看到這會比較慢。 – 2009-05-05 12:04:04

+1

我不明白爲什麼這些庫有線程安全的集合。 – 2009-05-05 12:31:52

+2

他沒有要求線程安全的集合類。正如你所說的那樣,他想要一個「更高層次的構造」來「包裝」實現。 – Matt 2010-08-09 23:06:05

0

試試這個庫

http://www.codeproject.com/KB/threads/lwsync.aspx

它是在一個現代C++基於策略的方法來實現。

這裏是鏈接一些切展現了這個念頭了「矢量」的情況下

typedef lwsync::critical_resource<std::vector<int> > sync_vector_t; 
sync_vector_t vec; 

// some thread: 
{ 
    // Critical resource can be naturally used with STL containers. 
    sync_vector_t::const_accessor vec_access = vec.const_access(); 
    for(std::vector<int>::const_iterator where = vec_access->begin(); 
     where != vec_access->end(); 
     ++where; 
     ) 
    std::cout << *where << std::endl; 
} 

sync_vector_t::accessor some_vector_action() 
{ 
    sync_vector_t::accessor vec_access = vec.access(); 
    vec_access->push_back(10); 
    return vec_access; 
    // Access is escalated from within a some_vector_action() scope 
    // So that one can make some other action with vector before it becomes 
    // unlocked. 
} 

{ 
    sync_vector_t::accessor vec_access = some_vector_action(); 
    vec_access->push_back(20); 
    // Elements 10 and 20 will be placed in vector sequentially. 
    // Any other action with vector cannot be processed between those two 
    // push_back's. 
} 
0

我想出了這個(我敢肯定,可以提高到超過兩個參數):

template<class T1, class T2> 
class combine : public T1, public T2 
{ 
public: 

    /// We always need a virtual destructor. 
    virtual ~combine() { } 
}; 

這允許你做:

// Combine an std::mutex and std::map<std::string, std::string> into 
// a single instance. 
SCA::combine<std::mutex, std::map<std::string, std::string>> lockableMap; 

// Lock the map within scope to modify the map in a thread-safe way. 
{ 
    // Lock the map. 
    std::lock_guard<std::mutex> locked(lockableMap); 

    // Modify the map. 
    lockableMap["Person 1"] = "Jack"; 
    lockableMap["Person 2"] = "Jill"; 
} 

如果您希望使用的std :: recursive_mutex和的std ::集,這也將正常工作。