中断已处于条件变量等待调用中的提升线程
Interupt boost thread that is already in condition variable wait call
我正在使用boost进程间库创建服务器和客户端程序,以便在共享内存中传递opencv-mat对象。每个服务器和客户端进程都有两个boost线程,它们是boost::thread_group的成员。一个处理命令行IO,另一个管理数据处理。共享内存访问使用boost::interprocesscondition_variables进行同步。
由于这个程序涉及共享内存,我需要在退出之前进行一些手动清理。我的问题是,如果服务器提前终止,那么客户端上的处理线程会在wait()
调用时阻塞,因为服务器负责发送通知。我需要以某种方式中断卡在wait()
的线程,以启动共享内存销毁。我知道在线程上调用interrupt()
(在我的情况下是thread_group.interrupt_all()
)会导致boost::thread_interrupted
异常在到达中断点时抛出(如wait()
),如果不处理,则会允许共享内存销毁继续进行。然而,当我试图在线程处于wait()
时中断它时,似乎什么都没有发生。例如,这不会向命令行打印任何内容:
try {
shared_mat_header->new_data_condition.wait(lock);
} catch (...) {
std::cout << "Thread interrupt occurredn";
}
我一点也不确定,但似乎需要在线程进入wait()
之前进行interrupt()
调用才能引发异常。这是真的吗?如果没有,那么中断被condition_variable.wait()
调用阻塞的提升线程的正确方法是什么?
感谢您的真知灼见。
编辑我接受了Chris Desjardins的回答,该回答没有直接回答问题,但具有预期效果。在这里,我正在翻译他的代码片段,以便与boost::interprocess
条件变量一起使用,后者与boost::thread
条件变量的语法略有不同:
while (_running) {
boost::system_time timeout = boost::get_system_time() + boost::posix_time::milliseconds(1);
if (shared_mat_header->new_data_condition.timed_wait(lock, timeout))
{
//process data
}
}
我更喜欢等待超时,然后检查等待调用的返回代码,看看它是否超时。事实上,我有一个我喜欢使用的线程模式来解决这种情况(以及c++中线程的其他常见问题)。
http://blog.chrisd.info/how-to-run-threads/
对你来说,要点是不要在线程中无限阻塞,所以你的线程看起来像这样:
while (_running == true)
{
if (shared_mat_header->new_data_condition.wait_for(lock, boost::chrono::milliseconds(1)) == boost::cv_status::no_timeout)
{
// process data
}
}
然后在析构函数中设置_running=false;并连接线程。
尝试使用"通知函数"。保留一个指向条件变量的指针并调用它,而不是中断线程。中断比通知电话要贵得多。
所以与其做
thread_group.interrupt_all()
改为调用
new_data_condition_pointer->notify_one()
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 等待整个 omp 块完成,然后再调用第二个函数
- 工作线程一直在等待,condition_variable甚至调用了notify_all
- 我有一个调用ID3D11DeviceContext::CopySubresourceRegion的循环.我怎么能强制等待
- 有没有办法调试排队等待对象的Qt插槽调用
- 是否可以等待来自暂存缓冲区的传输完成而不调用 vkQueueWaitIdle
- 从动态库交互式调用函数,无需等待返回(python,ctypes)
- 中断已处于条件变量等待调用中的提升线程
- 在POSIX中,我可以保存信号以供调用条件等待的其他线程使用吗.(这些线程来自同一进程)
- 除了繁忙的等待之外,还有其他处理器密集度较低的方法来限制调用函数的速度吗
- 等待从获取锁的函数调用的帮助程序函数中的条件变量
- C++ 在调用 std::unique_lock 等待之前解锁 std::mutex
- IBM MQ 回调函数调用等待,直到某些作业完成
- 使用轮询系统调用等待 fds 时 CPU 使用率高
- 是否可以调用 WriteFile,应用程序将永远等待回调
- 立即调用OnMove(),而不是等待窗口的实际移动
- 等待中的谓词在循环中使用notify时只调用一次
- 在Linux上,从C++调用一个可执行文件,然后等待它完成
- Winsock -等待调用accept(),直到客户端真正尝试连接
- C++ getline() 在多次调用时不会等待来自控制台的输入