在使用C ++ 11的std::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;
}
.pro文件:
QT += core
QT -= gui
TARGET = Threads
CONFIG += console
CONFIG -= app_bundle
QMAKE_CXXFLAGS += -std=c++11 -pthread
TEMPLATE = app
SOURCES += main.cpp
当使用'Run in terminal disabled'运行它时,产生的输出是:
foo:4 5 9
foo:4 5 18
foo:4 5 27
(预期)
或:
foo:4 5 9
foo:4 5 18
(错误,一次run()调用缺失)
由于此应用程序实际上并不是多线程的(只有一个子线程始终运行),因此它看起来不像竞争条件。知道附加代码有什么问题吗?