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

时间:2012-06-07 08:15:17

标签: linux multithreading stdout

我有一个linux程序(语言没关系),它将日志打印到stdout上。 监控过程需要日志IS。

现在我要通过fork'ing或使用线程来并行化。

问题:产生的stdout将包含不可读的不相关行的混合......

最后问题:如何重新构建并行流程的输出逻辑?

4 个答案:

答案 0 :(得分:3)

很抱歉自己回答......

明确的解决方案是使用GNU parallel实用程序。

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

所以我只是按原样离开了我的简单的单进程,单线程实用程序,并通过parallel管理它的调用:

  

generate-argument-list |并行<选项>我的效用

根据并行的选项,这可以为my-utility

的多次调用生成很好的分组输出

答案 1 :(得分:2)

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

要实现它,您应该将所有日志记录封装在一个函数或对象中,并在内部锁定和解锁互斥锁。

如果日志阻止性能变得过高,您可以考虑缓冲日志消息(在前面提到的对象或函数中),并且只在缓冲区已满时写入stdout。你仍然需要使用互斥保护来缓冲,但缓冲比写入stdout要快。

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

答案 2 :(得分:2)

如果您使用的是C ++,我会考虑使用Pantheios或衍生版本Boost :: Log或使用Logging In C++ : Part 2

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

如果此监控被视为系统范围,您还可以考虑使用syslog

答案 3 :(得分:1)

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