1

在玩 C++ 11std::thread时,我发现了以下奇怪的应用程序行为(使用 Qt Creator 2.7.2):

文件 main.cpp:

#include <iostream>
#include <thread>

class A {
public:
    A() {
        j = 0;
    }

    void run() {
        std::thread t(&A::foo, this, 4, 5);
        t.join();
    }

private:
    int j;

    void foo(int x, int y) {
        j+=x; j+=y;
        std::cout << "foo: " << x << " " << y << " " << j << std::endl;
    }
};

int main(int argc, char *argv[])
{
    Q_UNUSED(argc);
    Q_UNUSED(argv);

    A a;
    a.run();
    a.run();
    a.run();

    return 0;
}

。轮廓:

QT       += core

QT       -= gui

TARGET = Threads
CONFIG   += console
CONFIG   -= app_bundle

QMAKE_CXXFLAGS += -std=c++11 -pthread

TEMPLATE = app

SOURCES += main.cpp

在“禁用终端运行”的情况下运行它时,产生的输出是:

富:4 5 9
富:4 5 18
富:4 5 27

(预期的)

或者:

富:4 5 9
富:4 5 18

(错误,缺少一个 run() 调用)

由于这个应用程序还不是真正的多线程(只有一个子线程始终在运行),它看起来不像是竞争条件。知道附加代码有什么问题吗?

4

0 回答 0