在朴素轮询实现中增强中断

时间:2009-10-20 13:15:42

标签: boost multithreading polling

我开发了一个简单的轮询线程(使用Boost 1.39.0),它检查是否在给定的时间范围内访问了数据资源,如果没有则清除连接。相关代码可在下面查看。

我的担忧是双重的:

1)是否在睡眠中使用中断以安全地关闭线程?中断会等待睡眠完成还是会立即中断?你可以看到我抓住一个thread_interrupted异常只是为了逃避while循环。

2)使用花费大部分时间的线程是否浪费?在标准C ++中实现简单的轮询机制是否有更好的模式?

boost::xtime xt;

while (1) {
    try {
        boost::xtime_get(&xt, boost::TIME_UTC);
        xt.sec += _sleep_secs;
        boost::thread::sleep(xt);
        //
        // logic to check resource access
        // etc.
    } 
    catch(boost::thread_interrupted const&) {
        return;
    }
}

2 个答案:

答案 0 :(得分:2)

1)从POSIX线程的boost :: thread :: interrupt()的Boost实现判断它必须是安全的:

void thread::interrupt()
{
    detail::thread_data_ptr const local_thread_info=get_thread_info();
    if(local_thread_info)
    {
        lock_guard<mutex> lk(local_thread_info->data_mutex);
        local_thread_info->interrupt_requested=true;
        if(local_thread_info->current_cond)
        {
            BOOST_VERIFY(!pthread_cond_broadcast(local_thread_info->current_cond));
        }
    }
}

它们锁定互斥锁,将interrupt_requested设置为true并在条件变量上进行广播。如果它在boost :: thread :: sleep()中休眠,线程将立即被唤醒。并且他们在取消线程的顺序中不使用pthread_cancel。

2)如果我们谈论Windows,Linux或HP-UX等操作系统,我认为一个线程不会浪费资源。这是支持这一点的引用:

  

许多操作系统也是如此   处理不止一些问题   百线程。如果每个线程得到一个   2MB堆栈(不是一个不常见的默认值   价值),你用完虚拟   内存 at(2 ^ 30/2 ^ 21)= 512个线程   在一台1GB的32位机器上   用户可访问的VM(比如Linux   通常在x86上发货)

答案 1 :(得分:0)

我认为使用完全没问题,很多人都使用它(想想关机顺序,当你需要关闭线程时 - 你会中断()然后它们都可以关闭)。

关于boost,请确保阅读文档:特别是,只有少数指令是“中断点”,这意味着线程将被中断并且只有在执行该指令时中断时才会获得该异常。如果线程正在执行其他操作,则只有在您输入中断点时才会收到中断,这可能在请求interrupt后可能会有一段时间,具体取决于您在线程中执行的操作。

我认为在任何情况下都是如此,这就是我对以下内容的解释:

  

线程将在下次启用中断时进入其中一个预定义中断点时被中断,或者如果在启用中断的情况下调用其中一个预定义中断点时线程将被阻止。

来自the boost thread documentation