【发布时间】:2012-06-10 12:41:36
【问题描述】:
如果在 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);
}
问题似乎是如果在main 退出后调用std::thread::join(),则它永远不会返回。它在 cthread.c 中定义的_Thrd_join 中的WaitForSingleObject 处被阻塞。
在main 末尾取消注释SleepFor(100); 允许程序正确退出,就像使std_test 非静态一样。使用boost::thread 也可以避免这个问题。
所以我想知道我是否在这里调用了未定义的行为(对我来说似乎不太可能),或者我是否应该针对 VS2012 提交错误?
【问题讨论】:
-
测试版和候选发布版问题?
-
@Jaywalker 好吧,我想这就是我要问的。如果在
main退出后调用join(),它不会挂起是否合理。如果是这样,这是一个我希望尽快进入 MS Connect 的错误。 -
你能不能测试一下
std::thread::joinable()在挂起之前是否仍然返回true? -
请在Microsoft Connect 上提交一个错误(我不知道这是否实际上 一个错误;我对
std::thread规范不太熟悉。但是尽管如此,还是值得报告的。) -
@Plexico
thread_.joinable()确实返回true。
标签: c++ visual-c++ c++11 stdthread visual-c++-2012