【发布时间】:2013-08-12 13:23:30
【问题描述】:
我只是在写一个多线程/并发教程,下面的代码(我认为)应该不能正常工作,因为 5 个不同的线程在同一个对象上运行。
但它每次都准确地打印出 500 个。这是如何运作的?我没有使用互斥锁,因此无法防止多个线程访问相同的数据...
#include <iostream>
#include <vector>
#include <thread>
using namespace std;
struct Counter {
int value;
void increment() {
value++;
}
};
int main(){
Counter counter;
counter.value = 0;
vector <thread> threads;
for (int i = 0; i < 5; i++){
threads.push_back(thread([&counter](){
for (int i = 0; i < 100; ++i){
counter.increment();
}
}));
}
for (auto& thread : threads)
thread.join();
cout << counter.value << endl;
cin.get();
return 0;
}
【问题讨论】:
-
它可以是未定义的行为(可以摆动正确或错误)
-
我想
value++语句被编译为一条指令(即它增加内存中的一个值),因此增量不太可能不起作用(即线程 A 读取它,线程 B 读取它,线程 A 写入增量值,线程 B 写入相同的增量值)。 -
我认为你需要
std::packaged_task,而不是std::thread。此外,您还需要互斥锁或其他一些同步对象。 -
尝试将
increment()改为if (value < 50) value+=2;;如果 Drew 是正确的,您可能会更幸运地看到“不正确”的输出。 -
或者,或者,将
counter.value更改为没有原子增量的类型,例如float或double。
标签: c++ multithreading mutex