std :: thread :: join () zawiesza się, jeśli zostanie wywołany po zamknięciu main () podczas używania VS2012 RC
Poniższy przykład działa pomyślnie (tzn. Nie zawiesza się), jeśli jest skompilowany przy użyciu Clang 3.2 lub GCC 4.7 na Ubuntu 12.04, ale zawiesza się, jeśli kompiluję za pomocą VS11 Beta lub 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);
}
Wydaje się, że tak jeststd::thread::join()
nigdy nie zwraca, jeśli zostanie wywołany pomain
odszedł. Jest zablokowany wWaitForSingleObject
w_Thrd_join
zdefiniowane w cthread.c.
OdkomentowanieSleepFor(100);
na końcumain
pozwala programowi na prawidłowe wyjście, podobnie jak tworzeniestd_test
niestatyczny. Za pomocąboost::thread
również unika tego problemu.
Więc chciałbym wiedzieć, czy wywołam tutaj niezdefiniowane zachowanie (wydaje mi się mało prawdopodobne), czy też powinienem zgłosić błąd przeciwko VS2012?