Nie rozumiem dlaczego ten prosty fragment ma martwego Lock:std :: thread.join() impas
#include <atomic>
#include <thread>
#include <memory>
using namespace std;
class Test {
public:
Test() : mExit(false)
{
mThread = thread(bind(&Test::func, this));
}
~Test()
{
if (mThread.joinable())
{
mExit = true;
mThread.join();
}
}
private:
void func()
{
while (!mExit)
{
// do something
}
}
private:
atomic<bool> mExit;
thread mThread;
};
typedef unique_ptr<Test> TestPtr;
TestPtr gTest;
int main()
{
gTest = TestPtr(new Test);
return 0;
}
Edycja Wpisałem źle contstructor ustawić mExit = true
Edycja 2 Używam msvc2012 z zestawem narzędzi v110_xp.
Edycja 3 Problem znika, jeśli jawnie wywołać gTest.release() wewnątrz głównego
'mExit = false' ?? –
Napisałem źle, przepraszam. Problem pozostaje. –
Hmm. Prawdopodobnie nie będzie lepiej, dopóki nie użyjesz atomic poprawnie. I użyj debuggera, aby dowiedzieć się, co robi wątek. Znaczne szanse, że jest wyłączone w chwastach, blokowanie niektórych wywołań systemu operacyjnego zamiast wypalania 100% rdzenia sprawdzającego ten stan wyjścia w kółko. –