Повышение Здания.Поток без перерыва
Как я могу построить boost.поток без точки прерывания по умолчанию. Я думаю, что мое приложение аварийно завершает работу в заранее определенных точках прерывания. Я использую boost 1.53.0 с msvc10
У меня есть следующий код
class IOController {
public:
IOController() { mThread = boost::thread( boost::bind( &IOController::poll, this ) ); }
~IOController() {mThread.interrupt(); mThread.join() }
void doA() { boost::lock_guard<boost::mutex> lock( mMutex); }
private:
void ICanThrow()
{
try
{
boost::lock_guard<boost::mutex> lock( mMutex);
callFunctionWithSleepFor(); // calling function that can throw and use boost::sleep_for
}
catch( boost::system_error&) {}
catch( std::exception& ) {}
catch ( ... ) { /* APPLICATION CRASH. */ }
}
// this is a thread: mThread = boost::thread(&IOController::poll, this) on ctor
void poll()
{
while(true)
{
callFunctionWithSleepFor( );
this_thread::sleep_for( some_time );
}
}
boost::mutex mMutex;
boost::thread mThread;
};
Теперь у меня есть основной поток, который вызывает, который вызывает doA очень интенсивным способом, и класс опрашивает другой поток. Но иногда я могу сделать исключение в ICanThrow in the catch (...). Я понятия не имею, почему это происходит. Но бывает всегда от опроса() нитка.
Теперь я хочу попробовать построить Boost без DONT_PROVIDE_INTERRUPTIONS. Неужели у кого-то предлагаешь?
2 ответа:
Может быть, взглянете на http://www.boost.org/doc/libs/1_35_0/doc/html/thread/thread_management.html . прерывание потока можно отключить с помощью класса disable_interruption. Я не использовал его сам, но похоже, что если вы создаете экземпляр disable_interruption, прерывания должны быть отключены до тех пор, пока объект disable_interruption не выйдет из области видимости.
Проблема заключается в том, что когда деструктор IOController вызывает
mThread.interrupt()
функцию в другом месте, которая использует sleep_for, возникает исключение. это исключение caght вcaught(...)
, но relly-это простоboost::thread_interrupted
класс, не производный ни от чего. Проблема теперь в том, чтоthread_interrupted
не является caght в методе опроса, поэтому приложение блокируется наmThread.join()