C++ C++;使用map时需要互斥吗?

C++ C++;使用map时需要互斥吗?,c++,map,mutex,C++,Map,Mutex,我有两个线程,一个是插入,另一个是删除地图中的条目。我想知道这些函数调用周围是否有互斥锁?还有一个线程增加这个映射中的一个计数器,另一个线程减少这个计数器。我也需要互斥吗 谢谢,对映射本身的更改(插入、删除)需要同步。遍历和查找也是如此(即begin(),find(),[]等) 但是,多个线程可以安全地访问不同的元素。对映射本身的更改(插入、删除)需要同步。遍历和查找也是如此(即begin(),find(),[]等) 但是,多个线程可以安全地访问不同的元素。如果要对映射中的同一元素进行递增和递减

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

谢谢,

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

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

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


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

如果要对
映射中的同一元素进行递增和递减(或者可能是同一元素,但您不能确定),则需要进行某种同步。您可以使用
std::atomic
来避免使用
mutex
tho'


树中的任何插入或删除都需要使用
互斥锁
或类似工具进行保护,当然,这也意味着对树内容的任何访问都需要以相同的方式进行保护,因此如果使用
std::map::iterator
(至少对于树中的
擦除
)将无效。因此,您确实需要确保在使用对树的任何其他访问时不会发生任何
擦除
。这包括“现成”功能,如
查找

如果要对
映射图中的同一元素进行递增和递减(或者可能是同一元素,您无法确定),则需要进行某种同步。您可以使用
std::atomic
来避免使用
mutex
tho'



树中的任何插入或删除都需要使用
互斥锁
或类似工具进行保护,当然,这也意味着对树内容的任何访问都需要以相同的方式进行保护,因此如果使用
std::map::iterator
(至少对于树中的
擦除
)将无效。因此,您确实需要确保在使用对树的任何其他访问时不会发生任何
擦除
。这包括“现成”功能,如
查找

如果两个线程都对同一数据进行了更改,那么您需要保护该数据不受竞争的影响。您需要提供同步。STL容器不是线程安全的;1) std::map::迭代器it2=mymap.find(val);2) mymap.erase(it2);插入(std::pair(val,obj));但以下情况并非如此;myobj=it2->秒;it2->second->ctr++;如果两个线程都对同一数据进行了更改,那么您需要保护该数据不受竞争的影响。您需要提供同步。STL容器不是线程安全的;1) std::map::迭代器it2=mymap.find(val);2) mymap.erase(it2);插入(std::pair(val,obj));但以下情况并非如此;myobj=it2->秒;it2->second->ctr++;查找函数怎么样?其中一个线程正在使用map的find函数,我是否也需要find函数周围的互斥锁?@AvbAvb:是的,查找也需要同步。不能让一个线程在另一个线程更改地图时遍历地图。因此,您应该获得迭代器或引用,同时使用互斥锁进行保护,但是您可以在锁之外更改元素的内容(前提是您保证它们不会被删除)。谢谢,我不知道这一点。begin函数怎么样?换句话说,只要不发生并发写入,就可以有多个并发读卡器。@ipmcc:不,这与此无关。find函数怎么样?其中一个线程正在使用map的find函数,我是否也需要find函数周围的互斥锁?@AvbAvb:是的,查找也需要同步。不能让一个线程在另一个线程更改地图时遍历地图。因此,您应该获得迭代器或引用,同时使用互斥锁进行保护,但是您可以在锁之外更改元素的内容(前提是您保证它们不会被删除)。谢谢,我不知道这一点。begin函数如何?换句话说,只要不发生并发写入,您就可以有多个并发读卡器。@ipmcc:不,这与此无关。例如,以下要求互斥;1) std::map::迭代器it2=mymap.find(val);2) mymap.erase(it2);插入(std::pair(val,obj));但以下情况并非如此;myobj=it2->秒;it2->second->ctr++;只要您知道
it2
引用的对象在您使用它的同时没有被擦除(并且没有其他线程正在执行
it2 ctr++
),那么:是。例如,以下要求互斥;1) std::map::迭代器it2=mymap.find(val);2) mymap.erase(it2);插入(std::pair(val,obj));但以下情况并非如此;myobj=it2->秒;it2->second->ctr++;只要您知道
it2
引用的对象在使用时没有被擦除(并且没有其他线程正在执行
it2 ctr++
),那么:是。