如何并行写入容器
How to write parallelly into a container
我正在使用 C++14,但我不知道如何使用多线程并行写入容器。
假设我有这样一张地图:std::map<int, int> mp {{1, 0}, {2, 0}, {3, 0}}
和如下函数:
void updateValue(int& value) {
value = xxx; // heavy calculation
}
然后我尝试创建三个线程:
std::vector<std::thread> vec;
for (auto& ele : mp) {
vec.emplace_back(std::thread(updateValue, std::ref(ele.second)));
}
但是,问题是 std::map
不是线程安全的。
所以看来我需要在函数updateValue
中加一把锁。但是如果我这样做,函数就得一个一个调用,跟单线程一样。
在这种情况下有什么方法可以让我使用多线程吗?
您的示例按原样是安全的,不需要任何额外的同步。
[container.requirements.dataraces]/2 Notwithstanding [res.on.data.races], implementations are required to avoid data races when the contents of the contained object in different elements in the same container, excepting vector<bool>
, are modified concurrently.
我正在使用 C++14,但我不知道如何使用多线程并行写入容器。
假设我有这样一张地图:std::map<int, int> mp {{1, 0}, {2, 0}, {3, 0}}
和如下函数:
void updateValue(int& value) {
value = xxx; // heavy calculation
}
然后我尝试创建三个线程:
std::vector<std::thread> vec;
for (auto& ele : mp) {
vec.emplace_back(std::thread(updateValue, std::ref(ele.second)));
}
但是,问题是 std::map
不是线程安全的。
所以看来我需要在函数updateValue
中加一把锁。但是如果我这样做,函数就得一个一个调用,跟单线程一样。
在这种情况下有什么方法可以让我使用多线程吗?
您的示例按原样是安全的,不需要任何额外的同步。
[container.requirements.dataraces]/2 Notwithstanding [res.on.data.races], implementations are required to avoid data races when the contents of the contained object in different elements in the same container, excepting
vector<bool>
, are modified concurrently.