我如何原子地替换向量?

时间:2016-11-19 03:14:01

标签: multithreading c++11 atomic

我正在使用C ++ 11编写一个多线程程序。我想以原子方式替换向量,而可能有一些其他工作线程迭代旧向量。我不关心旧工人的工作是否被浪费,但我必须确保替换是原子的,新工人将得到新的载体。

我想我可能需要std::atomic<std::shared_ptr<std::vector<T>>>>?但是,由于std::shared_ptr不能轻易复制,因此无法编译。以下代码(似乎?)有效,但它泄漏了内存:

#include <atomic>
#include <memory>
#include <vector>
#include <thread>
#include <cstdio>

std::atomic<std::vector<int>*> v;

void read(const char* name) {
    long sum = 0;
    for (int x : *v) sum += x;
    printf("read(%s) sum = %ld\n", name, sum);
}

void replace() {
    v = new std::vector<int>(100, 2);
}

int main() {
    v = new std::vector<int>(10000000, 1);
    std::thread t1(read, "t1");
    std::thread t2(read, "t2");
    std::thread t3(replace);
    t3.join();
    std::thread t4(read, "t4");
    std::thread t5(read, "t5");
    t1.join();t2.join();t4.join();t5.join();
}

1 个答案:

答案 0 :(得分:1)

shared_ptr已经是线程安全的,你没有(也不能)将它包装在atomic<>中。只需在您的阅读器中复制shared_ptr,在编写完成后,您可以在填写新数据后swap使用新的。{/ p>