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.