我可以用另一根线冲洗我的蒸汽吗
Can I flush my ofstream on a separate thread?
我有一个在主线程上运行回调的关键进程,我将这些回调中的各种数据记录到文件中。我不想在关键回调期间将输出刷新到文件会带来性能损失,但我也不能无限期地等待系统决定刷新流缓冲区。也就是说,我可以等几秒钟,但不能等几分钟,才能看到文件监视器中的数据。
我可以在一个单独的线程上运行一个定时器吗?这个线程经常刷新数据流,还是线程不安全?
或者有没有更好的方法将数据记录到文件中,从而最大限度地减少关键线程的负载?
(如果Boost提供了任何方便的解决方案,我会使用它。)
由于ofstream
不是线程安全的,您必须在刷新它时锁定它,因此性能损失最终大致相同(关键回调不需要花时间刷新,而是在它刷新时等待单独的线程释放锁)。
对于"这是否足够快?"这个问题,标准答案是"在做大量额外工作之前,先测量一下并找出答案。"你是否测量过性能,以确认回调的刷新是个问题?
如果从回调中清除是一个问题,那么一种选择是使用生产者-消费者队列;回调队列日志条目到线程安全队列,而使用者线程锁定队列,弹出条目,解锁队列,然后将条目写入磁盘。
标准的字符串不是线程安全的。一个常见的替代方案是让处理线程将写入请求排入队列,并让单个线程进行写入和刷新。例如,您可以动态地为内容分配缓冲区,并通过线程安全队列推送指针(仅在推送指针时进行最小锁定),并让另一端的线程根据需要频繁地写入文件刷新。
相关文章:
- 我有一个数组,我想输入一个范围,然后找到范围内所有偶数的总和?
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 如何格式化我的文本文件以使其不会一遍又一遍地重复同一行?
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 为什么我的信号处理程序只执行一次?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 我正在尝试解决英特尔架构并行基础课程中关于 Coursera 的一项作业
- 我的字符串数组一次打印出前两个字符串
- 为什么我的二叉树会覆盖其根的叶子?
- 为什么Visual Studio正在清除我的一串反斜杠
- 从我的2d数组中的一列返回的字符串值被压缩为一个字符串(在Mac os上打开Windows txt文件)
- 如何防止我的循环额外运行一次?
- 当我在结构中包含多个数组时,我的程序会跳过一堆代码
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- 我如何一遍又一遍地向用户提问,直到他们输入正确的值字段?
- 为什么 ofstream 无法在我的 CERN 根宏中打开文件?
- 我的一堆函数出现"undefined reference"错误,我不知道为什么
- 我可以用另一根线冲洗我的蒸汽吗
- 有什么方法可以避免systemctl在停止时杀死我的一个子进程