2012-06-07 78 views
3

我有一个linux程序(语言无所谓),它将它打印到stdout上。 监视进程需要日志。在多个线程/进程之间共享stdout

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

问题:导致标准输出将包含无关行不可读混合...

最后的问题是:你将如何重新构建输出逻辑并行处理?

+0

多个呼叫很好的组合输出是否要在日志分成单独的每个进程/线程日志,或做你只想避免混合多个进程的输出_inin_ a line? – lanzz

+0

它应该每个进程在视觉上分开。所以用户可以了解每个任务的状态。原子线是一个小问题,我只是使用一些同步对象。 – LiMar

+2

为您的日志行标记每个进程独特的内容,例如'[process- $ PID]'或'[roleOfTheProcess]'? – lanzz

回答

3

对不起,回答自己...

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

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

所以我刚刚离开我简单的一个过程,一个线程工具原样,并通过parallel像管道呼吁:

生成参数列表|平行<选项>我的效用

这取决于并行的选项可以产生的my-utility

2

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

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

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

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

2

如果你用C++是如果你用另一种语言是接档周围的IO操作锁定我会考虑使用或衍生版本的boost ::登录或使用看看Logging In C++ : Part 2

可能是方法去看File Locks,您可以使用semaphonres或任何其他过程控制系统实现相同的结果,但对我来说,文件锁定是最容易的。

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

0

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