我正在尝试为我的应用程序编写一个监视线程,它定期检查我的对象队列的长度,如果事情似乎失控,则退出程序。
目前我的主要运行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个线程。
答案 0 :(得分:2)
你实际上只是询问如何在线程之间进行通信。
监视器线程应以某种方式发出其他信号(例如condition_variable
或Boost thread interruption points)。
其他线程应该干净地关闭自己以响应信号。