gpt4 book ai didi

multithreading - 如何原子替换向量?

转载 作者:行者123 更新时间:2023-12-03 13:03:46 25 4
gpt4 key购买 nike

我正在使用C++ 11编写多线程程序。我想以原子方式替换向量,而可能还有其他工作线程在旧向量上进行迭代。我不在乎老 worker 的工作是否浪费,但我必须确保替代工作是原子的,新 worker 将获得新的工作机会。

我想我可能需要一个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();
}

最佳答案

shared_ptr已经是线程安全的,您不能(也不能)将其包装在atomic<>中。只需在您的阅读器中复制shared_ptr,然后在编写器中,您就可以在填充新数据后用新的swap对其进行编码。

关于multithreading - 如何原子替换向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40688861/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com