std :: thread :: join () trava se chamado depois que main () sai ao usar VS2012 RC

O exemplo a seguir é executado com êxito (ou seja, não é interrompido) se compilado usando Clang 3.2 ou GCC 4.7 no Ubuntu 12.04, mas trava se eu compilar usando o VS11 Beta ou 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);
}

A questão parece ser questd::thread::join() nunca retorna se for invocado depoismain saiu. Está bloqueado emWaitForSingleObject em_Thrd_join definido em cthread.c.

Sem comentáriosSleepFor(100); no fim demain permite que o programa saia corretamente, assim comostd_test não estático. Usandoboost::thread também evita o problema.

Então, eu gostaria de saber se estou invocando um comportamento indefinido aqui (parece improvável para mim), ou se eu deveria estar arquivando um bug contra o VS2012?

questionAnswers(4)

yourAnswerToTheQuestion