有誰知道在哪裏可以找到一個包裝STL映射並使其線程安全的implimentation?當我說線程安全時,我的意思是它只提供對地圖的串行訪問,一次只有一個線程。最佳情況下,這張圖應該只使用STL和/或boost結構。C++線程安全映射
回答
不符合您指定的標準,但你可以看看在TBB容器。有所謂的concurrent_hash_map
,它允許多個線程同時訪問地圖中的數據。有一些細節,但一切都很好記錄,並可以給你一個「併發容器」的想法。根據您的需求,這可能是完全不恰當......
boost shared_mutex將提供最佳的多讀取器/單寫入器方法來包裝給定約束的標準映射。我不知道任何「預先構建」的實現與這兩者結婚,因爲任務通常是微不足道的。
這個任務遠不是微不足道的,至少要做到高效率,這就是爲什麼你不會找到任何實現。 – 2009-05-04 15:19:14
好吧,也許「微不足道」是錯誤的詞。至少在你正在研究的具體情況下(除非你有一些非常具體的要求),這並不難做。 – Joe 2009-05-04 16:56:38
這取決於要實施的應用程序。一個「線程安全」的地圖會使地圖中的個別調用成爲線程安全的,但是很多操作需要在線程安全的之間調用。使用該映射的應用程序應該將一個互斥量與該映射相關聯,並使用該互斥量來協調對該映射的訪問。
試圖使線程安全的容器在Java中是一個錯誤,並且這在C++中是一個錯誤。
你能解釋爲什麼製作線程安全的容器是一個錯誤嗎? – einpoklum 2013-12-31 12:36:06
集合類提供線程安全性通常不是一個好主意,因爲他們無法知道它們是如何被使用的。通過在使用集合的更高級別構造中實現自己的鎖定機制,您將會得到更好的服務。
爲什麼這不是一個好主意?你能指點我一些文章嗎? 我只是不明白,爲什麼Java,C#/ VB(.NET)和C++都有併發集合的庫,如果他們是個壞主意。這些庫分別是:java.util.concurrent,System.Collections.Concurrent(.NET 4.0)和Intel的線程構建模塊。 是否只是通過使用這些庫來獲得性能優勢?我知道一些集合總是返回一個快照「複製」以進行迭代等,所以我可以看到這會比較慢。 – 2009-05-05 12:04:04
我不明白爲什麼這些庫有線程安全的集合。 – 2009-05-05 12:31:52
他沒有要求線程安全的集合類。正如你所說的那樣,他想要一個「更高層次的構造」來「包裝」實現。 – Matt 2010-08-09 23:06:05
試試這個庫
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.
}
我想出了這個(我敢肯定,可以提高到超過兩個參數):
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 ::集,這也將正常工作。
- 1. C++映射的線程安全
- 2. Java中的線程安全映射
- 3. 線程安全哈希映射?
- 4. 線程安全隊列映射
- 5. C#線程安全
- 6. Collections.synchronized映射是否使迭代器線程安全
- 7. 擁有映射類是線程安全的
- 8. 保留插入順序的線程安全映射
- 9. 線程安全的映射,具有空鍵功能
- 10. 線程安全的弱密鑰哈希映射
- 11. 線程安全與地圖和併發哈希映射
- 12. 彈簧安全映射
- 13. Tomcat安全角色映射
- 14. C++多線程 - 線程安全代碼
- 15. C#+ =線程安全嗎?
- 16. C++線程安全和notify_all()
- 17. C++線程安全整數
- 18. C#變量線程安全
- 19. C中的線程安全?
- 20. C++線程安全摘要
- 21. C#:線程安全事件
- 22. 是C#Font.Height線程安全
- 23. C++線程安全vector.erase
- 24. java線程安全:線程安全嗎?
- 25. 彈簧注射 - 線程安全
- 26. 使用C#/ Powershell設置Active Directory「安全身份映射」/「名稱映射」
- 27. C/C++ tmpnam的線程安全性?
- 28. 線程安全
- 29. 線程安全
- 30. 線程安全
此庫英特爾CPU是否依賴? – 2012-07-07 17:44:24