使用提升线程监视对象队列



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

目前我的主线程运行 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;
};

主.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 的线程中断点,例如)。

其他线程应该干净地关闭自己以响应信号。

最新更新