如何在C ++中单独锁定unordered_map元素

bre*_*red 2 c++ multithreading mutex unordered-map

我有一个unordered_map我希望可以被多个线程访问的方法,但是用互斥锁锁定整个过程太慢了。

为了解决这个问题,我在的每个元素中放置了一个互斥锁unordered_map

class exampleClass{
    std::mutex m;
    int data;
};

std::unordered_map<int,exampleClass> exampleMap;
Run Code Online (Sandbox Code Playgroud)

问题是我无法安全地擦除元素,因为要破坏互斥锁必须将其解锁,但是如果解锁,则另一个线程可以将其锁定并在破坏期间写入或读取该元素。

Sne*_*tel 6

unordered_map不适合用于细粒度的并行性。在过程中未确保相互排斥的情况下添加或删除元素是不合法的。

我建议改用类似的方法tbb::concurrent_hash_map,这将导致锁定争用少于锁定整个地图。(还有其他并发哈希表实现; TBB的优点是它得到了很好的支持和稳定。)