Multithreading 什么样的线程竞争影响?;

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:

如您所见,当我删除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;
}
#包括
#包括
#包括
#包括
使用名称空间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的工作
  • 现在,如果您使用的是类似于指令的原子指令,则不需要任何锁。请参阅