1

我开发了一个简单的轮询线程(使用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;
    }
}
4

2 回答 2

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 的堆栈(不是一个不常见的默认值),那么在具有 1GB 用户可访问 VM 的 32 位计算机上,您会在 (2^30 / 2^21) = 512 个线程处耗尽虚拟内存(例如, Linux 通常在 x86 上提供)

.

于 2009-10-23T13:58:41.130 回答
0

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

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

我认为无论如何都是如此,这就是我对以下内容的解释:

线程将在下次进入启用中断的预定义中断点之一时被中断,或者如果它当前在调用启用中断的预定义中断点之一时被阻塞。

来自boost thread 文档

于 2009-11-20T12:16:36.257 回答