3

我想使用 boost::thread interrupt() 来中断一个线程。我有以下代码不会引发 boost::thread_interrupted& 异常:

int myClass::myFunction (arg1, arg2) try{
//some code here
    do {   
        boost::this_thread::interruption_point(); 
        //some other code here
    } while (counter != 20000); 
}catch (boost::thread_interrupted&) {
    cout << "interrupted" << endl;
}

如果我将 boost::this_thread::interruption_point() 替换为 boost::this_thread::sleep( boost::posix_time::milliseconds(150)) 异常会抛出并且中断正常工作。

有人可以解释为什么 boost::this_thread::interruption_point() 不会抛出预期的异常吗?

4

1 回答 1

5

正如评论者指出的那样,无法排除简单的竞争条件(很大程度上取决于您的架构和 CPU 上的负载)。添加显式睡眠“帮助”的事实强调了这一点。

你在单核系统上运行吗?

这是一个简单的独立示例,以防您发现您正在做的事情有所不同。看这个简单的测试器:

#include <iostream> 
#include <boost/thread.hpp>

struct myClass { 
    int myFunction(int arg1, int arg2);
};

int myClass::myFunction (int arg1, int arg2)
{
    int counter = 0;
    try
    {
        //some code here
        do {   
            boost::this_thread::interruption_point(); 
            //some other code here
            ++counter;
        } while (counter != 20000); 
    } catch (boost::thread_interrupted&) {
        std::cout << "interrupted" << std::endl;
    }
    return counter;
}

void treadf() {
    myClass x;
    std::cout << "Returned: " << x.myFunction(1,2) << "\n";
}

int main()
{
    boost::thread t(treadf);
    //t.interrupt(); // UNCOMMENT THIS LINE
    t.join();
}

它打印

Returned: 20000

或者,如果您取消注释该行t.interrupt()

interrupted
Returned: 0

在我的 i7 系统上。在Coliru现场观看

于 2014-09-29T16:11:13.550 回答