使用Boost线程监视对象队列

时间:2016-01-13 06:44:31

标签: c++ multithreading boost ros

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

目前我的主要运行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个线程。

1 个答案:

答案 0 :(得分:2)

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

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

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