c++ - 中断已处于条件变量等待调用状态的 boost 线程

标签 c++ multithreading opencv boost

我正在使用boost interprocess library创建用于传递opencv mat objects的服务器和客户端程序围绕在共享内存中。每个服务器和客户端进程都有两个 boost 线程,它们是 boost::thread_group 的成员。一个处理命令行 IO,另一个管理数据处理。共享内存访问使用 boost::interprocess condition_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 occurred\n";
}

我完全不确定,但似乎需要在线程进入 wait() 之前调用 interrupt() 才能引发异常。这是真的?如果不是,那么中断被 condition_variable.wait() 调用阻塞的 boost 线程的正确方法是什么?

感谢您的见解。

编辑 我接受了 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;并加入线程。

关于c++ - 中断已处于条件变量等待调用状态的 boost 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29595820/

相关文章:

c++ - 多集上的 std::transform 给我错误 C3892

c++ - 将多个文件合并为一个

java - 从java中的线程池运行静态方法

c++ - 从 if 语句中初始化 C++11 线程

c# - 在异步线程中创建对象会导致 STA 异常

python - 在python中找到图像中每个框的均值

ios - YUV-NV12 video buffer的y平面和uv平面的延续

c++ - 什么时候应该在 C++ 中使用 'friend'?

c++ - g++ 函数匹配和 OpenCV 2.3.0

c++ - C++中的缓存(或多或少适合初学者)