std :: thread :: join () bleibt hängen, wenn main () bei Verwendung von VS2012 RC nach dem Beenden aufgerufen wird

Das folgende Beispiel wird erfolgreich ausgeführt (d. H. Hängt nicht), wenn es mit Clang 3.2 oder GCC 4.7 unter Ubuntu 12.04 kompiliert wurde. Es hängt jedoch, wenn ich mit VS11 Beta oder VS2012 RC kompiliere.

#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);
}

Das Problem scheint das zu seinstd::thread::join() Gibt niemals zurück, wenn es danach aufgerufen wirdmain hat verlassen. Es ist bei gesperrtWaitForSingleObject im_Thrd_join definiert in cthread.c.

Nicht kommentierenSleepFor(100); am Ende vonmain Ermöglicht es dem Programm, ordnungsgemäß zu beenden, ebenso wie Makingstd_test nicht statisch. Verwendenboost::thread vermeidet auch das Problem.

Ich möchte also wissen, ob ich hier undefiniertes Verhalten hervorrufe (was mir unwahrscheinlich erscheint) oder ob ich einen Bug gegen VS2012 einreichen sollte.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage