2015-06-22 219 views
0

在我的应用程序中,我想实现一个高效的数据记录器,可以将记录打印到文件中。该应用程序运行在Beaglebone Black上,并且有一些软时间关键点。这就是为什么我不想简单地在旅途中打印痕迹,因为这会减慢应用程序。我想知道创建一个可以做到这一点的单例数据记录器类。现在我想知道如何将字符串变量保存到列表中。然后将项目从单独的线程列表中取出并保存到文件中。现在我知道如何做的方法是检查列表长度是否大于0,在每隔几毫秒的单独线程中,即每100毫秒使用一次睡眠。事情是,我越频繁地检查更多的处理器功耗将被消耗。我知道有像监视器这样的Linux机制可以监视文件中的更改。我想知道这种机制是否存在一个变量?例如,每次我将一个项目放入列表时,我都会增加一个int变量,随着观察变量的改变,保存到文件线程可能会触发。我甚至不确定这个机制对于应用程序来说是最好的办法,它只是我想到的。我真的会为这件事情提供一切帮助。在Linux中观察变量

+0

文件I/O没有像操作系统为您缓冲那么糟糕。如果您的应用程序已经是多线程的,那么同步队列是一条可行的路线。您可能会考虑引入一些日志框架,如log4cxx或Boost.log。在这里看到一些提示:[C++日志框架建议](http://stackoverflow.com/questions/1736295/c-logging-framework-suggestions) – stefan

+0

Stefan,谢谢你的链接。我会在未来的项目中记住它们,但现在这些框架将比我的整个应用程序更大。我想保持简单,现在就学习新的东西,这就是为什么我想自己写记录器。 – Bremen

回答

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; 
    } 
}; 
+0

所以,如果我已经理解了一切正确的方法,safill的push_back方法将一个字符串项放入队列中,pop_front应该放在while(1)中的单独线程中? – Bremen

+0

我试图按照你的例子,并实施它。我已经读了一些关于'condition_variable :: wait()',它似乎需要有一个unique_lock作为第一个参数传递,我不能理解你的行'cv.wait([](){return!data.empty ();});'你能澄清吗?这似乎工作对我来说,即时通讯仍然编写代码:'m_cv.wait(ul,[this](){return!m_data.empty();});' – Bremen

+0

@ŁukaszPrzeniosło:我草拟了解决方案,没有运行它通过一个编译器,它有几个问题......但你知道了 –