std :: thread :: join () зависает, если вызывается после выхода из main () при использовании VS2012 RC
Следующий пример выполняется успешно (т.е. не зависает), если скомпилирован с использованием Clang 3.2 или GCC 4.7 на Ubuntu 12.04, но зависает, если я скомпилировал с использованием 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
вышел. Он заблокирован наWaitForSingleObject
в_Thrd_join
определено в cthread.c.
раскомментировавSleepFor(100);
в концеmain
позволяет программе правильно завершить работу, как иstd_test
нестатическая. С помощьюboost::thread
также избегает проблемы.
Итак, я хотел бы знать, вызываю ли я здесь неопределенное поведение (кажется мне маловероятным), или мне следует сообщать об ошибке в VS2012?