如何在没有默认中断点的情况下构建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。有人有一些建议吗?
答案 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()
上被阻止