Повышение Здания.Поток без перерыва


Как я могу построить 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 3

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()