Следующий пример выполняется успешно (т.е. не зависает), если скомпилирован с использованием 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
также позволяет избежать проблемы.
Итак, я хотел бы знать, если я вызываю поведение undefined здесь (кажется маловероятным для меня), или если я должен подавать ошибку против VS2012?