std :: thread :: join () se cuelga si se llama después de que main () sale al usar VS2012 RC

El siguiente ejemplo se ejecuta correctamente (es decir, no se bloquea) si se compila con Clang 3.2 o GCC 4.7 en Ubuntu 12.04, pero se bloquea si compilo con VS11 Beta o 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);
}

El problema parece ser questd::thread::join() nunca regresa si es invocado despuesmain ha salido Esta bloqueado enWaitForSingleObject en_Thrd_join definido en cthread.c.

Sin comentariosSleepFor(100); al final demain permite que el programa salga correctamente, al igual que hacerstd_test no estático Utilizandoboost::thread También evita el problema.

Entonces, me gustaría saber si estoy invocando un comportamiento indefinido aquí (me parece poco probable), o si debería estar presentando un error en contra de VS2012.

Respuestas a la pregunta(4)

Su respuesta a la pregunta