Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我能用另一根线冲洗我的水流吗?_C++_Multithreading_Boost - Fatal编程技术网

C++ 我能用另一根线冲洗我的水流吗?

C++ 我能用另一根线冲洗我的水流吗?,c++,multithreading,boost,C++,Multithreading,Boost,我有一个在主线程上运行回调的关键进程,我将这些回调中的各种数据记录到文件中。我不想在关键回调期间导致将输出刷新到文件的性能损失,但我也不能无限期地等待系统决定刷新ofstream缓冲区。也就是说,我可以等待几秒钟,但不能等待几分钟,以查看文件监视器中的数据 我可以在一个单独的线程上运行一个计时器,这个线程经常刷新流的数据,还是说它不是线程安全的 还是有更好的方法将数据记录到文件中,从而最大限度地减少关键线程的负载 (如果Boost提供了任何方便的解决方案,我会使用Boost。)因为,在刷新时必须

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

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

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

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

因为,在刷新时必须锁定它,因此性能损失最终大致相同(不是关键回调花时间刷新,而是在刷新时花时间等待另一个线程释放锁)

对于“这是否足够快?”这一问题的标准答案是“在做大量额外工作之前进行测量并找出答案”。您是否测量了性能以确认回调刷新是一个问题


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

标准流不是线程安全的。一种常见的替代方法是让处理线程将要写入的请求排队,并让一个线程执行写入和刷新。例如,您可以动态分配包含内容的缓冲区,并通过线程安全队列推送指针(只有在推送指针时才进行最小锁定),并让另一端的线程尽可能频繁地写入文件刷新。

测量并找出答案-总的来说,我同意这种观点,但是,网络和磁盘IO通常从一开始就应该设计为异步的,这听起来像是其中的一种情况。一种简单的测量方法是用存根/子类替换流,该存根/子类具有相同的缓冲算法,但从不实际刷新。