如何并行写入容器

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.