std :: thread :: join () trava se chamado depois que main () sai ao usar VS2012 RC
O exemplo a seguir é executado com êxito (ou seja, não é interrompido) se compilado usando Clang 3.2 ou GCC 4.7 no Ubuntu 12.04, mas trava se eu compilar usando o VS11 Beta ou 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);
}
A questão parece ser questd::thread::join()
nunca retorna se for invocado depoismain
saiu. Está bloqueado emWaitForSingleObject
em_Thrd_join
definido em cthread.c.
Sem comentáriosSleepFor(100);
no fim demain
permite que o programa saia corretamente, assim comostd_test
não estático. Usandoboost::thread
também evita o problema.
Então, eu gostaria de saber se estou invocando um comportamento indefinido aqui (parece improvável para mim), ou se eu deveria estar arquivando um bug contra o VS2012?