我正在寻找类似于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