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?

23
задан James McNellis 6 June 2012 в 16:47
поделиться