次の例は、Ubuntu12.04でClang3.2またはGCC4.7を使用してコンパイルすると正常に実行されます(つまり、ハングしません)が、VS11BetaまたはVS2012RCを使用してコンパイルするとハングします。
#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です。cthread.cWaitForSingleObjectで定義されているでブロックされます。_Thrd_join
SleepFor(100);の最後でコメントを外すと、非静的mainにするのと同様に、プログラムを適切に終了できます。std_testを使用boost::threadすると、問題も回避できます。
それで、ここで未定義の動作を呼び出しているのか(私にはありそうもないようです)、またはVS2012に対してバグを報告する必要があるのかどうかを知りたいですか?