我有这样的地图
map<string,A>
现在当我从线程I迭代地图时,线程II正在向它插入一些东西。这种插入是否会影响阅读?
答案 0 :(得分:5)
是的,插入物会影响读数。该标准不提供线程安全保证。存在竞争条件,并且导致不确定的行为。
答案 1 :(得分:0)
是的,它会影响阅读。您需要在这两个线程之间使用其他同步机制。阅读std::mutex
和std::unique_lock
。
请参阅下面的示例代码:
#include <map>
#include <string>
#include <mutex>
#include <memory>
class MapWithMutex
{
public:
int readFromMap(const std::string& key)
{
std::unique_lock<std::mutex>(mtx);
//add some check if elements exists
return myMap[key];
}
void insertToMap(const std::string& key, int value)
{
//add check if element doesn't already exist
std::unique_lock<std::mutex>(mtx);
myMap[key] = value;
}
private:
std::map<std::string,int> myMap;
std::mutex mtx;
};
int main() {
MapWithMutex thSafeMap;
//pass thSafeMap object to threads
return 0;
}
请记住使关键部分尽可能小