我可以在单独的线程上刷新我的ofstream吗?

时间:2015-02-27 02:07:13

标签: c++ multithreading boost

我有一个在主线程上运行回调的关键进程,我将各种数据记录到这些回调中的文件中。我不想在关键回调期间产生将输出刷新到文件的性能损失,但我也无法无限期地等待系统决定刷新流的缓冲区。即,我可以等待几秒钟而不是几分钟,以查看我的文件监视器中的数据。

我可以在一个经常刷新ofstreams的单独线程上运行一个计时器,还是不是线程安全的?

或者有更好的方法将数据记录到文件中,以最大限度地减少关键线程的负载吗?

(如果提供任何方便的解决方案,我会使用Boost。)

2 个答案:

答案 0 :(得分:1)

ofstream is not thread safe开始,你必须在刷新它时锁定它,所以性能损失最终大致相同(而不是花时间冲洗的关键回调,他们花时间在一个单独的等待线程在刷新时释放锁定。)

问题的标准答案,"这种运行速度是否足够快?","在进行大量额外工作之前测量它并找出答案。"您是否测量过性能以确认从回调中清除是否有问题?

如果从回调中刷新是一个问题,那么一种替代方法是使用生产者 - 消费者队列;回调将日志条目队列到线程安全队列,而消费者线程锁定队列,弹出条目,解锁队列,然后将条目写入磁盘。

答案 1 :(得分:1)

标准流不是线程安全的。一种常见的替代方法是让处理线程将请求写入队列并让单个线程执行写入和刷新。例如,您可以使用内容动态分配缓冲区并将指针推送到线程安全队列(仅在按下指针时进行最小锁定)并让另一端的线程按照您的需要频繁写入文件刷新