使用map时,我们C++需要互斥锁

C++ do we need mutex when using map?

本文关键字:C++ map 我们 使用      更新时间:2023-10-16

>我有两个线程,一个正在插入,另一个正在删除映射中的条目。我想知道我是否在这些函数调用周围有互斥锁?还有一个线程递增此映射中的计数器,另一个线程递减该计数器。我也需要互斥锁吗?

谢谢

对映射本身的更改(插入、删除)需要同步。遍历和查找也是如此(即 begin()find()[]等)。

但是,多个线程可以安全地访问不同的元素

如果你在map中递增和递减 SAME 元素(或者可能是同一个元素,你不能肯定地说),那么你需要有某种同步。您可以使用std::atomic<int>来避免使用mutex

树中的任何插入或删除都需要用mutex或类似方式进行保护 - 当然,这也意味着对树内容的任何访问都需要以相同的方式进行保护,因此如果您使用std::map<T>::iterator(至少对于树中的erase)将失效。因此,您确实需要确保在使用对树的任何其他访问时不会发生erase。这包括"现成"功能,例如 find .