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