使用 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)。
其他线程应该完全关闭自己以响应信号。
我正在尝试为我的应用程序编写一个监视线程,它会定期检查我的对象队列的长度并在事情似乎失控时退出程序。
目前我的主要 运行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)。
其他线程应该完全关闭自己以响应信号。