2

我只是在做一个多线程/并发教程,下面的代码(我认为)应该不能正常工作,因为 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;
}
4

2 回答 2

3

根据编译器的不同,增量++i将产生一条指令,这意味着增量可能会以原子方式执行。

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

于 2013-08-12T13:38:53.037 回答
1

正如 Snps 所说,多线程处理可能是一种奇怪的野兽,我认为您可以在其中添加一些打印语句,这样您就可以检测它在运行时的行为方式。当我遇到与任何线程混淆的东西时,我通常会这样做。

于 2013-08-12T15:52:51.307 回答