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