Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
朴素轮询实现中的Boost中断_Boost_Multithreading_Polling - Fatal编程技术网

朴素轮询实现中的Boost中断

朴素轮询实现中的Boost中断,boost,multithreading,polling,Boost,Multithreading,Polling,我开发了一个简单的轮询线程(使用1.39.0),它检查数据资源是否在给定的时间范围内被访问,如果没有,则清除连接。相关代码可在下面查看 我的关注有两方面: 1) 在睡眠中使用中断是否适合安全地关闭线程?中断是等待睡眠结束还是立即中断?您可以看到我捕获了一个线程中断异常,只是为了逃避while循环 2) 使用花费大部分时间睡眠的线程是否浪费时间?是否有更好的模式来实现标准C++中的简单轮询机制? boost::xtime xt; while (1) { try { boo

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

我的关注有两方面:

1) 在睡眠中使用中断是否适合安全地关闭线程?中断是等待睡眠结束还是立即中断?您可以看到我捕获了一个线程中断异常,只是为了逃避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;
    }
}
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));
        }
    }
}
void线程::中断()
{
detail::thread_data_ptr const local_thread_info=get_thread_info();
if(本地线程信息)
{
锁定保护lk(本地线程信息->数据互斥);
本地线程信息->中断请求=true;
如果(本地线程信息->当前条件)
{
BOOST_-VERIFY(!pthread_-cond_广播(本地线程信息->当前线程));
}
}
}
它们锁定互斥锁,将请求的中断设置为true,并在条件变量上广播。如果线程在boost::thread::sleep()中休眠,它将立即被唤醒。而且他们不使用pthread_cancel来取消线程

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

许多操作系统也是如此 处理多个问题时遇到困难 一百条线。如果每个线程都有一个 2MB堆栈(并非罕见的默认值 值),您的虚拟资源用完了 位于(2^30/2^21)的内存=512个线程 在具有1GB的32位计算机上 用户可访问的虚拟机(比如Linux 通常在x86上提供)


我认为使用是完全正确的,很多人都使用它(想想关闭序列,当你需要关闭线程时,你会中断()然后他们就可以关闭)

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

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

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


谢谢,我一直在我的开发环境中运行它,它似乎如预期的那样工作。不过,我需要花一些时间来正确理解线程。谢谢你的帮助。很高兴能得到一些好的建议,因为对于那些不习惯(或任何?)线程编程的人来说,boostthreading文档很难理解。