在boost :: thread中同步STD cout输出而不控制线程

时间:2015-02-02 18:28:55

标签: c++ multithreading boost synchronization cout

我想问一下与此处提出的完全相同的问题: Synchronizing STD cout output multi-thread 有一个例外,我无法控制使用 boost :: thread 的代码(该代码是this library的内部代码,我不应该/不想触摸它,除非这个问题不能以任何其他方式解决,在这种情况下我可以将它添加到我的库的分支。)

库在某个时间产生4个线程(我在2010年中期的MacBook Pro上使用OSX 10.10)在C ++代码中执行,在单个线程中我使用cout进行日志记录,如下所示: / p>

cout << "Writing file: " << "\n" << xmlFileName << endl;

由于多线程,此输出会出现乱码,因此很难理解在任何给定时刻单个线程中发生了什么......

如何让输出同步?该项目使用Boost 1.57.0,所以我可以使用它。我之前从未涉及多线程,但我理解出现的概念和问题。我在SO上也看到了一些例子,但是所有这些例子都需要访问产生线程的代码,要么使用传递给线程的共享Mutex,要么使用lockGuard

虽然我觉得我无法逃避修改库代码,但我希望这在某种程度上可行吗?

1 个答案:

答案 0 :(得分:0)

  1. 你可能会非常hacky并编写一个sycnhronizing流缓冲区。

    然后你可以在cout对象上使用它:

    std::cout.rdbuf(new my_sync_cout_buf());
    

    在开始线程之前。

    请注意,这需要一定量的烦躁不安才能以漂亮的方式响应刷新。如果(其中一个)线程大量使用std::unitbufstd::flush,则执行此操作将会中断。

    在绝对最坏的情况下,您必须打开线程ID并交错输出(例如逐行)

      

    THINKO: ostream对象本身仍然是非线程安全的。所以它只是选项#2,真的:

  2. 也许从一个线程中打开管道并从另一个线程中读取它们会更容易(也更安全)。这样您就可以协调自己完成输出的顺序。当然,由于你不控制线程,你必须 fork 而不是启动线程。

    然后,在每个子进程中,您可以设置std::cout的流缓冲区以写入管道