【发布时间】:2020-01-29 00:16:28
【问题描述】:
在我的应用程序中,我基本上有多个线程来执行插入操作,并且主要是一个线程遍历映射并在满足某些条件时删除项目。我想使用并发结构的原因是它会在代码中提供更细粒度的锁定,以从队列中删除看起来与此类似的项目,这并不理想,原因包括线程在持有时可能被抢占锁。
Function_reap()
{
while(timetaken != timeoutTime)
{
my_map_mutex.lock();
auto iter = my_unordered_map.begin();
while(iter != my_unordered_map.end())
{
if(status_completed == iter->second.status)
{
iter = my_unordered_map.erase(iter);
}
}
my_map_mutex.unlock();
}
}
正在阅读英特尔 TBB(线程构建模块)的文档,更具体地说,是 concurrent_unordered_map 文档 (https://software.intel.com/en-us/node/506171),以查看这是否适合我的应用程序并看到了这段摘录。
说明 concurrent_unordered_map 和 concurrent_unordered_multimap 支持并发插入和 遍历,但不是并发擦除。接口没有可见 锁定。他们可能在内部持有锁,但在调用时绝不会 用户定义的代码。它们的语义类似于 std::unordered_map 和 std::unordered_multimap 分别,除了如下:
- erase 和 extract 方法以 unsafe_ 为前缀,表示它们不是并发安全的。
- 为什么 TBB 不提供从地图中安全同步删除?这是什么技术原因?
- 如果我在这里还有其他选择怎么办?理想情况下,绝对可以在 Linux 上运行,如果可能的话,可以移植到 Windows。
【问题讨论】:
标签: c++ multithreading tbb