如果在 Ubuntu 12.04 上使用 Clang 3.2 或 GCC 4.7 编译,则以下示例运行成功(即不会挂起),但如果我使用 VS11 Beta 或 VS2012 RC 编译则挂起。
#include <iostream>
#include <string>
#include <thread>
#include "boost/thread/thread.hpp"
void SleepFor(int ms) {
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
}
template<typename T>
class ThreadTest {
public:
ThreadTest() : thread_([] { SleepFor(10); }) {}
~ThreadTest() {
std::cout << "About to join\t" << id() << '\n';
thread_.join();
std::cout << "Joined\t\t" << id() << '\n';
}
private:
std::string id() const { return typeid(decltype(thread_)).name(); }
T thread_;
};
int main() {
static ThreadTest<std::thread> std_test;
static ThreadTest<boost::thread> boost_test;
// SleepFor(100);
}
问题似乎是,如果在退出std::thread::join()
后调用它,则永远不会返回。main
它在 cthread.cWaitForSingleObject
中定义的地方被阻塞。_Thrd_join
SleepFor(100);
在末尾取消注释main
可以让程序正确退出,就像制作std_test
非静态一样。使用boost::thread
也避免了这个问题。
所以我想知道我是否在这里调用未定义的行为(对我来说似乎不太可能),或者我是否应该针对 VS2012 提交错误?