代码之家  ›  专栏  ›  技术社区  ›  Enlico

以下代码线程是否不安全?那么,我怎样才能使一个可能的结果更有可能出现呢?

  •  0
  • Enlico  · 技术社区  · 4 年前

    以下程序的屏幕输出是否确定?我的理解是,它不是,因为它可以是1或2,这取决于最新的线程是否获取 i 在另一个线程写入1之前或之后拾取它。

    另一方面,我一直看到相同的输出,就好像每个线程都在等待前一个线程完成一样,在本例中,我在屏幕上看到2个,或者如果我从中创建类似的线程,则看到100个 t1 t100 加入他们。

    如果答案是 不,结果是不确定的 ,有没有一种简单的玩具程序可以增加一个可能的结果出现的几率?

    #include <iostream>
    #include <thread>
    
    int main() {
    
        int i = 0;
    
        std::thread t1([&i](){ ++i; });
        std::thread t2([&i](){ ++i; });
    
        t1.join();
        t2.join();
    
        std::cout << i << '\n';
    }
    

    (我是这样编译和运行它的: g++ -std=c++11 -lpthread prova.cpp -o exe && ./exe .)

    0 回复  |  直到 4 年前
        1
  •  3
  •   Rami    4 年前

    您总是看到相同的结果,因为第一个线程在第二个线程之前启动并运行其操作。这会缩小竞争条件发生的窗口。

    但最终,仍然有可能发生这种情况,因为++操作不是原子操作(先读取值,然后递增,然后写入)。

    如果两个线程同时启动(例如:线程1由于CPU忙而变慢),那么它们将读取相同的值,最终结果将为1。