Это часть более крупного приложения, простого потока таймера, который корректно работает перед попыткой его завершения:
boost::asio::io_service io_service;
shared_ptr<thread> loop;
// it is not initialised here, just shows the idea
boost::asio::deadline_timer timer(io_service, interval);
void Timer::spin() {
loop = make_shared<thread>(&Timer::run, this);
}
void Timer::unspin() {
io_service.stop();
loop.get()->join();
}
void run() {
timer.async_wait(bind(&Timer::callbackWrapper, this, _1));
// restart
io_service.run();
}
Поток, созданный в spin
, теоретически завершен и присоединен вunspin()
.В случае, когда приложение заканчивается с join()
закомментированным, появляется сообщение об ошибке
terminate called without an active exception
, которое, если я его «расшифровал», означает «основной поток завершен, когда некоторые другие потоки все еще работают»(Я не знаю C ++ lingo.)
Если, в свою очередь, вызывается unspin()
, может появиться следующее сообщение об ошибке spotty :
terminate called after throwing an instance of 'std::system_error'
what(): Invalid argument
который наиболее вероятно брошен thread.join()
.Проблема в том, что я искал вокруг Stackexchange, но не смог объяснить другое сообщение.Я понимаю, что проблема может быть за пределами небольшого фрагмента кода (приложение довольно большое, поэтому я не включаю его).Но даже если это так, я бы просто спросил значение второго сообщения об ошибке и его возможных причин.