如何自动替换向量?
How do I atomically replace a vector?
我正在使用 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();
}
shared_ptr 已经是线程安全的,您不会(也不能)将它包装在 atomic<>
中。只需将 shared_ptr 复制到您的 reader 中,您就可以在编写器中 swap
填充新数据后使用新的
。
我正在使用 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();
}
shared_ptr 已经是线程安全的,您不会(也不能)将它包装在 atomic<>
中。只需将 shared_ptr 复制到您的 reader 中,您就可以在编写器中 swap
填充新数据后使用新的