std :: thread :: join () зависает, если вызывается после выхода из main () при использовании VS2012 RC

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

Итак, я хотел бы знать, вызываю ли я здесь неопределенное поведение (кажется мне маловероятным), или мне следует сообщать об ошибке в VS2012?

Ответы на вопрос(4)

Ваш ответ на вопрос