我在程序中成功使用了Concurrency::concurrent_unordered_map
(这是由Microsoft制定的实现)。这是需要的,因为多个元素的插入/更新和非常罕见的删除是以并发方式执行的。并行容器 - 在元素擦除时同步
我知道这个容器(与所有其他并发容器一样)提供了一个不安全的erase()
方法 - 用于擦除节点。
您认为最好的方法是使擦除过程也是线程安全的吗?这种情况很少像我刚才所说的那样发生(仅仅是因为用户干预),而且我不太喜欢在每次对容器执行搜索时都必须输入一个关键部分(或者对于其他任何操作,如迭代器遍历和节点更新)。你怎么看?我也在考虑基于事件的机制,但我不明白这在这里如何适用。
锁定用互斥的部分,从容器中清除,开锁。 –
互斥体的唯一问题是,似乎必须在同一个互斥体中包含对容器所做的所有其他更新:所以对元素的所有插入,迭代器遍历更新都必须由相同的互斥体保护。我宁愿选择另一种解决方案 – Ghita
好吧,你必须将擦除函数包装到'sync_erase()'中,并且保证客户*只调用该函数。然后你只把互斥锁放在那里。 –