Построение Boost.Thread без перерыва

Как я могу построить boost.thread без точки прерывания по умолчанию. Я думаю, что мое приложение вылетает в предопределенных точках прерывания. Я использую 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 в улове (...). Я понятия не имею, почему это происходит. Но всегда происходит из потока poll().

Теперь я хочу попробовать собрать Boost без DONT_PROVIDE_INTERRUPTIONS. Есть ли у кого-то предложения?


person Elvis Dukaj    schedule 26.04.2013    source источник
comment
Возможно, в dctor IOController mThread.interrupt заставляет ICanThrow() запускать исключение (boost::thread_interrupted, которое не является производным от std::exception) в точке, где находится статус boost::this_thread::sleep_for() ( функция вызова ICanThrow, имеющая этот статус). Таким образом, исключение перехватывается из ICanThrow() в методе cght( ... ). Но это приводит к тому, что poll() не прерывается. Является ли это возможным   -  person Elvis Dukaj    schedule 26.04.2013
comment
Скорее всего, вы получите сбой, не связанный с прерываниями. boost::thread_interrupted является производным от std::exception. Вы можете использовать средство disable_interruption для отключения прерываний текущего потока: boost.org/doc/libs/1_53_0/doc/html/thread/   -  person Igor R.    schedule 26.04.2013
comment
класс BOOST_SYMBOL_VISIBLE thread_interrupted {}; thread_interrupted ни от чего не происходит (к счастью). если thread_interrupted происходит от исключения, мы можем ошибочно захватить неправильное исключение (как я сделал)   -  person Elvis Dukaj    schedule 26.04.2013


Ответы (2)


Возможно, взгляните на http://www.boost.org/doc/libs/1_35_0/doc/html/thread/thread_management.html. Вы можете отключить прерывание потока с помощью класса disable_interruption. Я не использовал его сам, но похоже, что если вы создадите экземпляр disable_interruption, прерывания должны быть отключены до тех пор, пока объект disable_interruption не выйдет из области действия.

person Arno Duvenhage    schedule 27.04.2013

Проблема в том, что когда деструктор IOController вызывает mThread.interrupt() функцию, которая использует sleep_for, возникает исключение. это исключение поймано в caught(...), но на самом деле это всего лишь boost::thread_interrupted класс, не производный ни от чего. Проблема сейчас в том, что thread_interrupted не пойман в методе опроса, поэтому приложение заблокировано на mThread.join()

person Elvis Dukaj    schedule 26.04.2013