我可以用另一根线冲洗我的蒸汽吗

Can I flush my ofstream on a separate thread?

本文关键字:我的 一根 我可以      更新时间:2023-10-16

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

我可以在一个单独的线程上运行一个定时器吗?这个线程经常刷新数据流,还是线程不安全?

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

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

由于ofstream不是线程安全的,您必须在刷新它时锁定它,因此性能损失最终大致相同(关键回调不需要花时间刷新,而是在刷新时等待单独的线程释放锁)。

对于"这是否足够快?"这个问题,标准答案是"在做大量额外工作之前,先测量一下并找出答案。"你是否测量过性能,以确认回调的刷新是个问题?

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

标准的字符串不是线程安全的。一个常见的替代方案是让处理线程将写入请求排入队列,并让单个线程进行写入和刷新。例如,您可以动态地为内容分配缓冲区,并通过线程安全队列推送指针(仅在推送指针时进行最小锁定),并让另一端的线程根据需要频繁地写入文件刷新。

相关文章: