Das folgende Beispiel wird erfolgreich ausgeführt (dh nicht hängen), wenn mit Clang 3.2 oder GCC 4.7 auf Ubuntu 12.04 kompiliert, aber hängt wenn ich mit VS11 Beta oder VS2012 RC kompiliere.std :: thread :: join() hängt, wenn nach main() aufgerufen wird bei Verwendung von 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);
}
Das Problem scheint zu sein, dass std::thread::join()
nie zurück, wenn sie aufgerufen wird, nachdem main
verlassen hat. Es ist bei WaitForSingleObject
in _Thrd_join
in cthread.c blockiert blockiert.
uncommenting SleepFor(100);
am Ende der main
ermöglicht das Programm korrekt zu verlassen, wie std_test
nicht-statische ist machen. Mit boost::thread
wird auch das Problem vermieden.
Also würde ich gerne wissen, ob ich hier undefiniertes Verhalten hier anruft (scheint mir unwahrscheinlich), oder wenn ich einen Bug gegen VS2012 einreichen sollte?
Beta und Release Candidate Probleme? – Jaywalker
@Jaywalker Nun, ich denke, das ist, was ich frage. Ist es vernünftig zu erwarten, dass 'join()' nicht hängt, wenn es aufgerufen wird, nachdem 'main' beendet wurde. Wenn ja, ist dies ein Fehler, den ich eher früher als später in MS Connect bekommen möchte. – Fraser
Könnten Sie versuchen zu testen, ob die 'std :: thread :: joinable()' immer noch True vor dem Hängen zurückgibt? – Plexico