使用 Boost 线程监视对象队列

Monitoring Object Queues with Boost thread

我正在尝试为我的应用程序编写一个监视线程,它会定期检查我的对象队列的长度并在事情似乎失控时退出程序。

目前我的主要 运行s 2 个线程。代码的相关部分如下:

class SolveDGEM {
public:
    SolveDGEM();

    void processQueue();
    void pyramidalFrameQueueConsumer();

private:
    // Queues
    ConcurrentQueue<Eigen::MatrixXf> q_cam0; ///< Thread-safe and fast queue for cam0.
    ConcurrentQueue<ros::Time> q_cam0_time;  ///< Thread-safe and fast queue to hold capture timing for cam0.
    ConcurrentQueue<cv::Mat> q_cam0_cv;      ///< queue to hold cv::Mat for cam0

    ConcurrentQueue<Eigen::MatrixXf> q_cam1; ///< Thread-safe and fast queue for cam1.
    ConcurrentQueue<ros::Time> q_cam1_time;  ///< Thread-safe and fast queue to hold capture timing for cam1.
    ConcurrentQueue<cv::Mat> q_cam1_cv;      ///< queue to hold cv::Mat for cam0

    ConcurrentQueue<Frame> frameQueue;
};

main.cpp

int main(int, char **) {
    SolveDGEM dgem;

    boost::thread processQueueThread(&SolveDGEM::processQueue, &dgem);
    boost::thread pyramidalFrameConsumerThread(&SolveDGEM::pyramidalFrameQueueConsumer, &dgem);

    processQueueThread.join();
    pyramidalFrameConsumerThread.join();

    return 0;
}

我正在实施队列监控

void SolveDGEM::monitorQueues() {
    ros::Rate loopRate(1); // once per second

    while (ros::ok()) {
        if (pyramidalFrameQueue.size() > 100 || q_cam0.size() > 100) {
            ROS_ERROR("Queues seem to be groaning without bounds");

            // Code to quit all the other threads

            loopRate.sleep();
        }
    }
}

假设我 运行 在另一个 boost 线程中使用这个函数,那么使用这个线程退出我的应用程序并安全地退出其他 2 个线程的正确方法是什么。

你实际上只是在问如何在线程之间进行通信。

监视器线程应该以某种方式向其他线程发出信号(例如 condition_variable 或 Boost 的 thread interruption points)。

其他线程应该完全关闭自己以响应信号。