从多个boost线程写入Ofstream - g++和vs2008
ofstream write from multiple boost threads - g++ and vs2008
使用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工作;我的直觉是传递文件引用,并让每个线程附加到文件。
在多个线程对同一流进行不协调的写操作后,您希望看到什么结果?毕竟,这将是垃圾,即使溪流确实经受住了这种折磨……您需要在写操作之间实现某种协调。
- std::ofstream 作为类成员删除复制构造函数?
- ofstream::close() 是否在 Linux 上调用同步?
- 如何在软件代码中使用ofstream创建文件
- Ofstream和IFSTREAM有什么区别?
- 使用 libssh 从 SFTP 服务器下载文件并使用 C++ 将其写入 ofstream?
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- fstream / ifstream / ofstream 对象如何转换为布尔值
- 使用 auto_ptr<std::ofstream> 对象
- 传递数组结构、ofstream 和 interger 以运行
- 有没有办法使用 ofstream 保存屏幕截图?
- 使用 ofstream 写入文本文件时断言失败
- 当 ofstream 指针位于 std::map 中时,文件写入不会发生 C++.
- Ofstream一直给我函数的最后一行,而不是显示所有内容
- 如何将 std::ofstream& 传递给函数参数?
- BigInteger:在 C++ 中使用 ofstream 写入文件时如何将基数更改为 2?
- 数据不是用 ofstream 写入的,即使返回成功也是如此
- ofstream将额外的零字节写入Unix服务器上的文件
- 为什么我不能将 Windows 环境路径与 ofstream 一起使用来编写文本文件?
- 为什么 ofstream 比 fprintf 慢?
- 派生 std::ofstream 和重载运算符<<