Multithreading 什么样的线程竞争影响?;
如您所见,当我删除mt.lock()和mt.unlock时,结果小于50000 为什么?到底发生了什么?如果你能为我解释一下,我将不胜感激Multithreading 什么样的线程竞争影响?;,multithreading,Multithreading,如您所见,当我删除mt.lock()和mt.unlock时,结果小于50000 为什么?到底发生了什么?如果你能为我解释一下,我将不胜感激 #include <iostream> #include <thread> #include <vector> #include <mutex> using namespace std; class counter{ public: mutex mt; int value; public:
#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
班级计数器{
公众:
互斥mt;
int值;
公众:
计数器():值(0){}
空隙增加()
{
//锁山();
值++;
//mt.unlock();
}
};
int main()
{
计数器c;
向量线程;
for(int i=0;i++
实际上是两个操作。一个是读取值,另一个是递增值。因为它不是原子操作,所以在同一代码区域中操作的多个线程会混淆
作为一个例子,考虑三个线程在同一区域中运行,没有任何锁定:
线程1和2将值读取为999
线程1将递增的值计算为1000
,并更新变量
线程3读取1000
,递增到1001
,并更新变量
线程2将递增的值计算为999+1=1000
,并用1000
覆盖3的工作
现在,如果您使用的是类似于指令的原子指令,则不需要任何锁。请参阅