在我的应用程序中,我想实现一个高效的数据记录器,可以将记录打印到文件中。该应用程序运行在Beaglebone Black上,并且有一些软时间关键点。这就是为什么我不想简单地在旅途中打印痕迹,因为这会减慢应用程序。我想知道创建一个可以做到这一点的单例数据记录器类。现在我想知道如何将字符串变量保存到列表中。然后将项目从单独的线程列表中取出并保存到文件中。现在我知道如何做的方法是检查列表长度是否大于0,在每隔几毫秒的单独线程中,即每100毫秒使用一次睡眠。事情是,我越频繁地检查更多的处理器功耗将被消耗。我知道有像监视器这样的Linux机制可以监视文件中的更改。我想知道这种机制是否存在一个变量?例如,每次我将一个项目放入列表时,我都会增加一个int变量,随着观察变量的改变,保存到文件线程可能会触发。我甚至不确定这个机制对于应用程序来说是最好的办法,它只是我想到的。我真的会为这件事情提供一切帮助。在Linux中观察变量
回答
在不同的线程之间进行通信有不同的解决方案。由于您已经为列表支付同步费用,因此您可以添加一个条件变量并使用该变量来通知其他线程:
// 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;
}
};
所以,如果我已经理解了一切正确的方法,safill的push_back方法将一个字符串项放入队列中,pop_front应该放在while(1)中的单独线程中? – Bremen
我试图按照你的例子,并实施它。我已经读了一些关于'condition_variable :: wait()',它似乎需要有一个unique_lock作为第一个参数传递,我不能理解你的行'cv.wait([](){return!data.empty ();});'你能澄清吗?这似乎工作对我来说,即时通讯仍然编写代码:'m_cv.wait(ul,[this](){return!m_data.empty();});' – Bremen
@ŁukaszPrzeniosło:我草拟了解决方案,没有运行它通过一个编译器,它有几个问题......但你知道了 –
- 1. 在Xcode中观察变量
- 2. 如何在angularjs中观察此变量
- 3. 在AngularJS中观察外部变量?
- 4. 观察Angular2中的变量值变化
- 5. 转化观察到变量
- 6. 上观察到的变量
- 7. 观察只读变量
- 8. AngularJs观察窗口变量
- 9. Android/Java:观察主类中的变量
- 10. 在Linux中观察文件的更改
- 11. 如何观察Linux上的进程的TCP连接变量?
- 12. 观察成员变量值的变化
- 13. 观察变量变化不起作用
- 14. CS5.5观察“变量”窗口中的变量
- 15. 观察UIDatePicker中的变化
- 16. SAS如何在1个观察组串联不同的观察变量
- 17. 拉最后的观察变量
- 18. Dart:可观察变量不更新
- 19. 观察非实体全局变量
- 20. 双重统计观察值的变量
- 21. Angular2全局变量可观察
- 22. 观察一个PHP变量为XDebug Breakpoint
- 23. 计算可观察动态变量
- 24. 将观察者添加到BOOL变量
- 25. 淘汰赛JS观察全局变量
- 26. 聚合物:观察者全局变量
- 27. 如何用PyCharm观察变量?
- 28. Firebug - 自动刷新观察变量?
- 29. 如何突破观察变量?
- 30. 累加文本变量跨越观察
文件I/O没有像操作系统为您缓冲那么糟糕。如果您的应用程序已经是多线程的,那么同步队列是一条可行的路线。您可能会考虑引入一些日志框架,如log4cxx或Boost.log。在这里看到一些提示:[C++日志框架建议](http://stackoverflow.com/questions/1736295/c-logging-framework-suggestions) – stefan
Stefan,谢谢你的链接。我会在未来的项目中记住它们,但现在这些框架将比我的整个应用程序更大。我想保持简单,现在就学习新的东西,这就是为什么我想自己写记录器。 – Bremen