gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 07:43:42 25 4
gpt4 key购买 nike

使用 boost 线程库,我将打开的 ofstream 文件作为引用传递给每个线程,在一半的线程写入后出现某种崩溃,程序终止。我的假设是函数到达末尾,关闭文件,其余线程正在尝试写入已关闭的文件。作为测试,我为最后一个线程添加了一个连接语句,更多的线程设法写入文件。我的多线程经验是 2 天 - 昨天我构建了 boost 库,但在 C++ 或任何语言方面的经验并不多。

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

一些可能的解决方案:

  • 与其传递打开的文件,不如传递文件引用,让每个thread 打开文件,追加和关闭 ofstream myfile("database",
    ios::输出 | ios::app);
    - 来自这个已发布的解决方案 "How do Iadd..." ;这没有用

  • 通读 boost thread documentation , 有一个join_all() 函数,但在 vs2008 中从 boost 1.53.0 编译version, "error C2039: 'join_all' : 不是的成员
    'boost::thread'"

  • Use boost mutex or locks这个解释似乎是asnwer,但我首先想知道崩溃是否是由于多个写入冲突或文件在线程完成之前关闭写完了。

  • c++ ostream::write page引用多线程,但只是声明没有保证

  • This one states关于 boost::thread 和
    boost::function
    的工作与众不同,但回顾了boost::function 文献没有帮助解释一下注释意味着

  • 如果这是等待所有线程完成的问题,请返回而不是写入冲突,this discussion provides a solution那需要存储所有线程,并调用 join()

  • This discusses the Windows 特定的 WaitForMultipleObjects 但是这是特定于 Windows 的——这篇文章中的最后一个解决方案听起来像答案,但它没有投票,我无法判断它是否是 Windows具体与否。

  • Buffer everything to memory并在一个单独的函数中写出——这个解决方案是在 C# 中,但这种方法似乎是合理的。他们讨论的细节对我来说没有意义。

  • create threads in a loop - 似乎有最清晰的评论;使用此线程中给出的 boost::thread_group 方法解决

  • 有更多的论坛讨论,但它们听起来像是之前示例的更多版本

我想要一个同时适用于 Windows 和 Linux 的解决方案;我的直觉是传递文件引用并让每个线程附加到文件。

最佳答案

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

关于c++ - ofstream 从多个 boost 线程写入 - g++ 和 vs2008,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15301718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com