3

如何在没有默认中断点的情况下构建 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,并且该类正在轮询另一个线程。但有时我在 catch (...) 中的 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 回答
0

问题是当 IOController 的析构函数调用mThread.interrupt()一个使用 sleep_for 的函数 elsewere 时会抛出异常。这个例外存在于caught(...)但 relly 只是boost::thread_interrupted一个非派生自任何东西的类。现在的问题是thread_interruptedpoll 方法中没有,所以应用程序被阻止了mThread.join()

于 2013-04-26T16:25:55.110 回答