std :: thread :: join () se cuelga si se llama después de que main () sale al usar VS2012 RC
El siguiente ejemplo se ejecuta correctamente (es decir, no se bloquea) si se compila con Clang 3.2 o GCC 4.7 en Ubuntu 12.04, pero se bloquea si compilo con VS11 Beta o 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);
}
El problema parece ser questd::thread::join()
nunca regresa si es invocado despuesmain
ha salido Esta bloqueado enWaitForSingleObject
en_Thrd_join
definido en cthread.c.
Sin comentariosSleepFor(100);
al final demain
permite que el programa salga correctamente, al igual que hacerstd_test
no estático Utilizandoboost::thread
También evita el problema.
Entonces, me gustaría saber si estoy invocando un comportamiento indefinido aquí (me parece poco probable), o si debería estar presentando un error en contra de VS2012.