繁体   English   中英

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

[英]Synchronizing STD cout output in a boost::thread without control over threads

我想问的问题与此处完全相同: 同步STD cout输出多线程 ,但有一个例外,即我无法控制使用boost :: thread的代码(该代码在该库的内部) ,而且我不应该/不想碰它,除非无法以其他任何方式解决此问题,在这种情况下,我可以将其添加到库的fork中。)

该库在特定时间在C ++代码中生成4个线程(我使用OSX 10.10于2010年中的MacBook Pro),该线程在一个使用cout进行记录的单线程中执行,如下所示:

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

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

如何使输出同步? 该项目使用Boost 1.57.0,所以我可以使用它。 我以前从来没有处理过多线程,但是我了解出现的概念和问题。 我还看到了一些关于SO的示例,但所有示例都需要使用传递给线程的共享Mutex或使用lockGuard来访问生成线程的代码。

尽管我有种无法摆脱的修改库代码的感觉,但我希望这有可能吗?

  1. 您可能会变得非常骇客,并编写一个同步流缓冲区。

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

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

    在启动线程之前。

    请注意,这将需要一定的坐立不安才能很好地响应冲洗。 如果(其中一个)线程自由地使用std::unitbufstd::flush ,则此操作将失败。

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

    THINKO: ostream对象本身仍然是非线程安全的。 因此,实际上,这只是选项#2:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM