在 boost::unordered_map 的 std::string 和 std::list 中提供线程安全,同时对
Thread safety in boost::unordered_map of std::string and std::list, while making changes to list
我在性能关键型多线程环境中使用boost::unordered_map<const std::string, std::list<TypeA> >
。我知道写入 STL 容器不是线程安全的,boost::unordered_map
也是如此。
boost::unordered_map<const std::string, std::list<TypeA> > myMap;
// Added some elements to myMap
现在,如果我想将 A 类型的元素添加或删除到列表中,是否有必要锁定整个映射而不是锁定正在修改的列表,以便其他线程可以读取/写入其余的键值对?
// Assuming there are pair with the keys "Apple" and "Orange" in myMap
A a, b;
myMap["Orange"].push_back(a) //Add an element to the list
myMap["Apple"].remove(b); //Remove an element
如果列表被另一个 STL 容器替换,该怎么办?
谢谢。
由于您只修改包含的对象,而不是 [unordered_]map 本身,因此您只需锁定该包含的对象。如果将list
更改为另一个序列(例如,deque 或 vector),则应该保持不变 - 更改包含对象的类型不会更改您仅修改包含的对象的事实,而不是包含它的映射。
您不必在此处执行任何锁定。如果保证密钥已经存在,那么访问它们是一个不需要锁定的非突变操作(只要没有其他人在突变)。每个列表都是独立的 - 只要没有其他人同时访问myMap["Apple"]
,你就是黄金。当然,您可以简单地使用更适合该任务的东西,例如无锁列表,它可以安全地从多个线程中变异,或者 concurrent_unordered_map
,例如您可以在TBB或PPL中找到。
相关文章:
- 即发即弃 std::线程对象清理自身
- std::线程导致程序中止
- 在std::线程中使用已分配的结构数据
- 使用-static libstdc++时std::线程弱,因此在运行时会导致崩溃
- std::线程与 pthread_setschedparam 与 C++ 11.
- 运行 std::线程不在构造函数中
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 编译问题 C++ 同时,尝试通过调用另一个对象中的成员函数来创建 std:: 线程
- 错误:静态断言失败:std ::线程参数必须在转换为rvalues后不可行
- C STD ::线程中的种族状况或内存损坏
- 在 Valgrind 输出中仍然可以访问 std 线程向量的块
- 将类Cotaining std ::线程添加到向量
- 如何使用mingw编译C STD ::线程代码
- 从其他std ::线程更新QT GUI
- STD ::线程不会退出
- 处理 std::线程包装器类的立即销毁
- C++ std 线程并列出分段错误(核心转储)
- 杀死后的STD ::线程如何处理
- 干净取消在输入/输出调用中被阻止的 std::线程
- std ::线程最大并发线程