从多个boost线程写入Ofstream - g++和vs2008

ofstream write from multiple boost threads - g++ and vs2008

本文关键字:Ofstream g++ vs2008 boost 线程      更新时间:2023-10-16

使用boost线程库,我将打开的ofstream文件传递给每个线程作为引用,在一半线程写入后,会出现某种崩溃,程序终止。我的假设是,函数到达终点,关闭文件,剩下的线程试图写一个关闭的文件。作为测试,我为最后一个线程添加了一个连接语句,更多的线程设法写入文件。我的多线程经验是2天-昨天我得到了boost库构建和没有更多的经验在c++或任何语言。

我通读了一遍"可能已经有答案的问题",但没有人回答这个问题。有很多帖子都解决了这个问题的版本,也有很多方法来解决这个问题——这似乎更像是过度思考,有一种干净的方法来确保所有线程在文件关闭之前已经完成,并且每个线程的写操作都被缓冲在队列中,以防止写冲突。

一些可能的解决方案:

  • 不是传递一个打开的文件,而是传递文件引用并让每个线程打开文件,追加,并关闭ofstream myfile("database", ios::out | ios::app); -从这个张贴的解决方案"我如何添加……";

  • 通过阅读boost线程文档,有一个join_all()函数,但编译在vs2008从一个boost 1.53.0version, "error C2039: 'join_all' : is not a member of 'boost::thread'"

  • 使用boost互斥或锁这个解释似乎是答案,但我首先想知道坠机是否是由于多重原因写入冲突或文件在线程完成之前关闭写完。

  • 这个c++ ostream::write页面引用了多线程,但只是

  • 这个说明了一些关于boost::thread and boost::function工作的事情,就像没有其他的一样,但是回顾boost::function文献没有帮忙解释什么评论意味着

  • 返回如果这是等待所有线程完成的问题而不是写冲突,这个讨论提供了一个解决方案需要存储所有线程,并调用join()

  • 这讨论了windows特定的WaitForMultipleObjects但是这是Windows特有的——这篇文章的最后一个解决方案听起来像是答案,但它没有投票,我不知道它是否是窗口

  • 将所有内容缓冲到内存并在单独的函数中写入-这种解决方案是在c#中,但这种方法似乎是可行的。我不明白他们讨论的细节。

  • 创建线程在一个循环-似乎有最清晰的审查;用boost::thread_group方法求解

  • 有更多的论坛讨论,但他们听起来像以前的例子的更多版本

我想要一个解决方案,在windows和linux工作;我的直觉是传递文件引用,并让每个线程附加到文件。

在多个线程对同一流进行不协调的写操作后,您希望看到什么结果?毕竟,这将是垃圾,即使溪流确实经受住了这种折磨……您需要在写操作之间实现某种协调。