为什么这会产生正确的输出?

时间:2013-08-12 13:23:31

标签: c++ multithreading mutex

我正在研究多线程/并发教程,以下代码(我认为)应该无法正常工作,因为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;
}

2 个答案:

答案 0 :(得分:3)

取决于编译器,增量++i将产生单个指令,这意味着增量可能会以原子方式执行。

但是,当多个线程写入同一内​​存而没有任何形式的同步时,执行仍然会导致数据竞争,并导致未定义的行为。 UB意味着几乎任何事情都可能发生,包括显示正确的答案。

答案 1 :(得分:1)

多线程处理可能是一个奇怪的野兽,因为Snps说,我认为你添加了一些打印语句,所以你可以检测它在运行时的表现。当我遇到任何与线程混淆的东西时,我通常会这样做。