使用 boost 线程库,我将 open ofstream 文件作为参考传递给每个线程,在一半线程写入后出现某种崩溃并且程序终止。我的假设是函数到达末尾,关闭文件,其余线程正在尝试写入已关闭的文件。作为测试,我为最后一个线程添加了一个连接语句,并且更多的线程设法写入文件。我的多线程经验是 2 天 - 昨天我构建了 boost 库,但在 c++ 或任何语言方面没有太多经验。
我通读了“可能已经有你答案的问题”,但没有人回答这个问题。有很多帖子解决了这个问题的版本以及解决方案的许多方法 - 这似乎更像是过度思考,并且有一种干净的方法可以确保所有线程在文件关闭之前完成并且每个线程的写入都是缓冲在队列中以防止写入冲突。
一些可能的解决方案:
而不是传递打开的文件,而是传递文件引用并让每个线程打开文件,追加和关闭
ofstream myfile("database", ios::out | ios::app);
- 从这个发布的解决方案“我如何添加......”;这没有用通读boost线程文档,有一个
join_all()
函数,但在vs2008中从boost 1.53.0版本编译,"error C2039: 'join_all' : is not a member of 'boost::thread'"
使用 boost mutex 或 locks这个解释似乎是正确的,但我首先想知道崩溃是否是由于多次写入冲突或文件在线程完成写入之前关闭。
这个c++ ostream::write 页面引用了多线程,但只是声明没有保证
这一篇阐述了
boost::thread and boost::function
与其他作品不同的工作,但回顾boost::function
文献并不能帮助解释评论的含义回到如果这是等待所有线程完成而不是写冲突的问题,这个讨论提供了一个需要存储所有线程并调用的解决方案
join()
这讨论了特定于Windows的问题,
WaitForMultipleObjects
但这是特定于 Windows 的 - 这篇文章中的最后一个解决方案听起来像是答案,但它没有投票,我无法判断它是否特定于 Windows。将所有内容缓冲到内存并在单独的函数中写出 - 此解决方案使用 C#,但该方法似乎是合理的。他们讨论的细节对我来说没有意义。
在循环中创建线程- 似乎有最清晰的评论;
boost::thread_group
使用此线程中给出的方法解决有更多的论坛讨论,但它们听起来像是之前示例的更多版本
我想要一个适用于 windows 和 linux 的解决方案;我的直觉是传递文件引用并让每个线程附加到文件中。