【问题标题】:How to watch a variable in Linux如何在 Linux 中观察变量
【发布时间】:2015-06-22 19:09:26
【问题描述】:

在我的应用程序中,我想实现一个高效的数据记录器,它将轨迹打印到文件中。该应用程序在 Beaglebone Black 上运行,并且有一些软时间关键点。这就是为什么我不想简单地在旅途中打印痕迹,因为这会减慢应用程序的速度。我想知道创建一个可以做到这一点的单例数据记录器类。现在我想知道将跟踪保存到推送到列表的字符串变量中。然后在单独的线程中从列表中取出项目并保存到文件中。

现在我知道如何做到这一点的方法是每隔几毫秒检查该单独线程中的列表长度是否大于 0,即每 100 毫秒使用睡眠。问题是我检查得越频繁,消耗的处理器能力就越多。我知道有像观察者这样的 Linux 机制可以观察文件的变化。我想知道变量是否存在这种机制?例如,每次我将一个项目放入列表时,我都会增加一个整数变量,然后可以在监视变量更改时触发保存到文件线程。

我什至不确定这种机制是否是应用程序的最佳方法,这只是我想到的。

【问题讨论】:

  • 文件 I/O 并没有操作系统为您缓冲那么糟糕。如果您的应用程序已经是多线程的,则可以使用同步队列。你可以考虑引入一些日志框架,比如 log4cxx 或 Boost.log。在此处查看一些提示:C++ logging framework suggestions
  • 斯特凡,谢谢你的链接。我会在未来的项目中记住它们,但现在这些框架将比我的整个应用程序更大。我想保持简单并暂时学习一些新东西,这就是我想自己编写记录器的原因。

标签: c++ linux multithreading variables


【解决方案1】:

不同线程之间的通信有不同的解决方案。由于您已经为列表的同步付费,您可以添加一个条件变量并使用它来通知另一个线程:

// 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;
   }
};

【讨论】:

  • 所以如果我理解的一切都是正确的,push_back 方法会安全地将一个字符串项放入队列中,并且 pop_front 应该放在 while(1) 中的单独线程中?
  • 我正在尝试按照您的示例并实施它。我已经阅读了一些关于condition_variable::wait() 的内容,它似乎需要一个 unique_lock 作为第一个参数传递,我不太明白你的行cv.wait([]() { return !data.empty(); }); 你能澄清一下吗?这似乎对我有用,我仍在编写代码:m_cv.wait(ul, [this]() { return !m_data.empty(); });
  • @ŁukaszPrzeniosło:我草拟了解决方案,没有通过编译器运行它,它有几个问题......但你想通了
猜你喜欢
  • 1970-01-01
  • 2015-09-08
  • 1970-01-01
  • 2011-08-24
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多