在我的应用程序中,我想实现一个高效的数据记录器,它可以将跟踪打印到文件中。该应用程序在Beaglebone Black上运行,并且有一些软时间关键点。这就是为什么我不想在旅途中简单地打印痕迹,因为这会减慢应用程序的速度。我想知道如何创建一个单独的数据记录器类来执行此操作。现在我想知道将跟踪保存到推送到列表的字符串变量。然后从单独的线程中将项目从列表中取出并保存到文件中。现在,我知道如何做的方法是检查列表长度是否在每隔几毫秒的单独线程中大于0,即每隔100毫秒使用睡眠。问题是我检查的频率越高,消耗的处理器功率就越大。我知道有像浏览器这样的linux机制可以监视文件的变化。我想知道变量存在这种机制吗?例如,每当我将一个项目放入列表时,我会增加一个int变量,然后保存到文件线程可以随着观察变量的变化而触发。 我甚至不确定这个机制是应用程序的最佳方法,它只是我想到的。我真的会在这件事情上给予所有帮助。
答案 0 :(得分:0)
不同的线程之间有不同的通信解决方案。由于您已经要为列表的同步付费,您可以添加一个条件变量并使用它来通知另一个线程:
// sketch
class SynchedQueue {
std::deque<std::string> data;
std::mutex m;
std::condition_variable cv;
public:
void push_back(std::string s) {
std::unique_lock<std::mutex> l(m);
data.emplace_back(std::move(s));
cv.notify();
}
std::string pop_front() {
std::unique_lock<std::mutex> l(m);
cv.wait(l, [&]() { return !data.empty(); });
std::string r = std::move(data.front());
data.pop_front();
return r;
}
};