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?

questionAnswers(4)

yourAnswerToTheQuestion