不间断地构建Boost.Thread

时间:2013-04-26 14:41:08

标签: c++ boost boost-thread

如何在没有默认中断点的情况下构建boost.thread。我认为我的应用程序在预定义的中断点崩溃。我正在使用带有msvc10的boost 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。有人有一些建议吗?

2 个答案:

答案 0 :(得分:1)

也许看看http://www.boost.org/doc/libs/1_35_0/doc/html/thread/thread_management.html。您可以使用disable_interruption类禁用线程中断。我自己没有使用它,但看起来如果你实例化 disable_interruption ,应该禁用中断,直到 disable_interruption 对象超出范围。

答案 1 :(得分:0)

问题是,当IOController的析构函数调用mThread.interrupt()时,一个函数else正在使用sleep_for抛出异常。这个例外在caught(...)中很明显,但仅仅是boost::thread_interrupted一个非衍生出来的类。 现在的问题是,thread_interrupted在调查方法中不合适,因此应用程序在mThread.join()上被阻止