3

デフォルトの中断ポイントなしで boost.thread をビルドするにはどうすればよいですか。事前定義された中断ポイントでアプリケーションがクラッシュしたと思います。msvc10 でブースト 1.53.0 を使用しています

私は次のコードを持っています

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() スレッドから発生します。

ここで、DONT_PROVIDE_INTERRUPTIONS なしで Boost をビルドしてみます。誰かに提案がありますか?

4

2 に答える 2

1

http://www.boost.org/doc/libs/1_35_0/doc/html/thread/thread_management.htmlをご覧ください。disable_interruption クラスを使用して、スレッドの割り込みを無効にすることができます。私自身は使用していませんが、 disable_interruptionをインスタンス化すると、 disable_interruptionオブジェクトが範囲外になるまで割り込みを無効にする必要があるようです。

于 2013-04-27T17:24:39.530 に答える