C++多线程问题疑问

img


想问一下这里global的值最后不为0,是因为多线程对共享数据没有加锁吗,所以为什么会不为零呢,这个join函数不是在执行完task函数才执行吗,刚学多线程不是太懂

确实是因为无效竞争. 可以看看操作系统相关章节, 一般是CPU->缓存->内存的线路出现问题.
一般程序不会这么设计, 有两种方案,
第一, 加锁, 或用原子变量.
第二, 是无锁设计, 但要求不能对同变量无效竞争, 可以用两个变量各自计算, 然后相加, MapReduce

两个线程对globalVariable进行自增和自减操作,但是这两个操作并不是原子性的。也就是说,自增和自减操作可能涉及到多个底层指令,而线程的切换可能发生在任意一个指令的执行点。所以会出现这种情况,为了防止这种情况发生,可以使用互斥锁防止冲突。代码如下:

#include <iostream>
#include <thread>
#include <mutex>

using namespace std;

int globalVariable = 0;
mutex mtx;

void task1() {
    for (int i = 0; i < 1000000; i++) {
        mtx.lock(); // 锁定互斥锁
        globalVariable++;
        globalVariable--;
        mtx.unlock(); // 解锁互斥锁
    }
}

int main() {
    thread t1(task1);
    thread t2(task1);
    t1.join();
    t2.join();

    cout << "current value is " << globalVariable << endl;
    return 0;
}