如您所见,当我删除mt.lock()和mt.unlock时,结果小于50000。
为什么?实际发生了什么?如果你能为我解释,我将非常感激。
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
using namespace std;
class counter{
public:
mutex mt;
int value;
public:
counter():value(0){}
void increase()
{
//mt.lock();
value++;
//mt.unlock();
}
};
int main()
{
counter c;
vector<thread> threads;
for(int i=0;i<5;++i){
threads.push_back(thread([&]()
{
for(int i=0;i<10000;++i){
c.increase();
}
}));
}
for(auto& t:threads){
t.join();
}
cout << c.value <<endl;
return 0;
}
答案 0 :(得分:0)
++
实际上是两个操作。一个是读取值,另一个是递增值。由于它不是原子操作,因此在同一代码区域中运行的多个线程会混淆。
例如,考虑在同一区域中运行的三个线程没有任何锁定:
value
读为999
1000
并更新变量1000
,递增到1001
并更新变量999 + 1 = 1000
并使用1000
现在,如果您使用的是"fetch-and-add"指令,其中 是原子的,那么您就不需要任何锁定。见fetch_add