首页 > 试题广场 >

下面 C++ 代码的运行结果可能是() #include

[不定项选择题]
下面 C++ 代码的运行结果可能是()
#include <iostream>
#include <thread>
#include <mutex>

class Main {
private:
    static int count;
    std::mutex mtx;

public:
    void increment() {
        mtx.lock();
        count++;
        mtx.unlock();
    }

    static void main(int argc, char* argv[]) {
        Main obj1, obj2;
        std::thread t1([&obj1]() {
            for (int i = 0; i < 1000; i++) {
                obj1.increment();
            }
        });
        std::thread t2([&obj2]() {
            for (int i = 0; i < 1000; i++) {
                obj2.increment();
            }
        });

        t1.join();
        t2.join();

        std::cout << count << std::endl;
    }
};

int Main::count = 0;

int main(int argc, char* argv[]) {
    Main::main(argc, argv);
    return 0;
}
  • 1678
  • 2001
  • 2000
  • 2089

静态变量count被两个线程通过两个不同的Main对象(obj1和obj2)进行递增操作。每个Main对象都有自己的互斥锁mtx。

由于count是静态的,即所有对象共享同一个变量,但是每个对象使用自己的互斥锁来保护对count的访问。这意味着两个线程实际上使用的是不同的互斥锁,因此它们可以同时进入各自的临界区(即同时执行increment函数中的count++)。这会导致数据竞争,因为两个线程在没有共同锁保护的情况下对同一个共享变量进行修改。

因此,count++操作不是原子性的,可能会被线程交替执行,导致一些递增操作被覆盖。最终的结果将小于2000(因为每个线程递增1000次,理想情况下是2000次)。

发表于 2025-09-23 17:22:50 回复(0)