在多个线程/进程之间共享stdout

我有一个Linux程序(语言无关紧要),它打印它login到标准输出。 日志IS需要监视进程。

现在我将通过fork或使用线程来并行化它。

问题:由此产生的标准输出将包含不可读的组合不相关的行…

最后问题:你将如何重构并行进程的输出逻辑?

Solutions Collecting From Web of "在多个线程/进程之间共享stdout"

对不起,我自己回答…

明确的解决方案是使用GNU并行工具。

它来取代众所周知的xargs实用程序,但并行运行命令,将输出分成组。

所以我只是简单地离开了我的简单的一个进程,一个线程的实用程序,并通过parallel来传递它的调用:

生成参数列表| 并行<options> my-utility

这取决于并行的选项可以为my-utility多个调用产生很好的分组输出

如果你在C ++,我会考虑使用Pantheios或派生版本Boost :: Log或使用看看在C ++中登录:第2部分或

如果你使用的是另一种语言,那么围绕IO操作的文件锁定可能是要去查看文件锁的方法 ,你可以使用semaphonres或任何其他的进程控制系统来获得相同的结果,但是对于我来说文件锁是最简单的。

如果将此监视视为系统范围,则还可以考虑使用syslog 。

如果它的多线程,那么你需要互斥保护打印/写入到标准输出日志。 在Linux和c / c ++中最常用的方法是使用pthread_mutex。 另外,如果它的c ++,boost有可以使用的同步。

要实现它,你应该把所有的日志记录封装在一个函数或者对象中,然后在内部锁定和解锁这个互斥锁。

如果日志记录阻塞性能变得过高,可以考虑缓冲日志消息(在前面提到的对象或函数中),并且只在缓冲区满时写入标准输出。 你仍然需要互斥保护来缓冲,但是缓冲将比写入到stdout更快。

如果每个线程都有自己的日志消息,那么他们仍然需要共享相同的互斥锁来写入标准输出。 在这种情况下,每个线程可能最好缓冲其各自的日志消息,并且只在缓冲区满时写入标准输出,因此只能获得写入标准输出的互斥量。

我们使用的另一种方法是委派一个线程,记录器线程进行日志记录。 所有其他希望登录的线程都会将其发送到记录器线程。 这种方法为您提供了灵活性,因为日志的格式可以是单个地方,也可以是可配置的。 如果你不想担心锁可以使用套接字来传递消息。