在多线程应用程序中控制台

时间:2011-03-30 19:26:22

标签: c++ c multithreading logging

通常开发应用程序我习惯于打印到控制台以获得有用的调试/跟踪信息。我正在使用的应用程序,因为它是多线程的,有时我看到我的printf相互重叠。

我尝试使用mutex同步屏幕,但我最终放慢了速度并阻止了应用。如何解决这个问题?

我知道MT日志库但在使用它们时,由于我记录太多,我的应用程序速度慢了一点。

我正在考虑以下想法......而不是在 我的应用程序中记录为什么不在之外登录呢?我想通过套接字将日志信息发送到实际在屏幕上打印出来的第二个应用程序进程。

您是否知道任何图书馆已经这样做了? 我使用Linux / gcc。

感谢

AFG

5 个答案:

答案 0 :(得分:11)

您有3个选项。按复杂程度递增:

  1. 只需在每个帖子中使用一个简单的互斥锁即可。所有线程都共享互斥锁。
  2. 将所有输出发送到只执行日志记录的单个线程。
  3. 将所有输出发送到单独的日志记录应用程序。
  4. 在大多数情况下,我会选择#2。 #1可以作为起点,但除了最简单的应用程序之外,您可以遇到序列化应用程序的问题。 #2仍然非常简单,简单是一件好事,但它也具有很强的可扩展性。你仍然最终在主应用程序中进行处理,但对于绝大多数应用程序而言,通过将其转移到它自己的专用应用程序中,你什么都得不到。

    在性能关键型服务器类型的应用程序中,您将要做的是第3项,但使用此方法获得的最小性能提升为1:非常难以实现,2:非常容易搞砸,3:不是人们通常采用这种方法的唯一甚至最令人信服的理由。相反,当人们需要将日志记录服务与使用它的应用程序分开时,人们通常采用这种方法。

答案 1 :(得分:1)

据我所知,临界区的重量较轻。

如果使用gcc,则可以使用原子访问。 Link.

答案 2 :(得分:1)

您使用的是哪种操作系统?

不确定特定的库,但这种问题的一种经典方法是使用日志队列,该队列由编写器线程工作,其作业纯粹是编写日志文件。

您需要注意,使用线程方法或写入队列可能备份的多进程方法,这意味着需要通过丢弃条目或通过减慢应用程序来管理(这显然是如果是线程方法,则更容易。

通过某种方式对日志记录输出进行分类也很常见,这样您就可以将代码的一部分记录在较高级别,而代码的另一部分则记录在较低级别。这使得管理写入文件的输出量变得更加容易,并且您可以选择通过登录来释放代码,但是关闭它以便在安装时可以用于故障诊断。

答案 3 :(得分:0)

坦率地说,Mutex是你真正想要的唯一方式,因此你的情况总是很慢,因为你使用了这么多的印刷语句....所以要解决你的问题,不要使用这么多print_f语句;那是你的问题。

好的,您的解决方案是使用互斥锁进行打印吗?也许你应该有一个互斥到另一个线程正在处理打印的消息队列的互斥;有可能挂断,但我认为会更快。因此,使用一个活动的日志记录线程来旋转等待传入的消息进行打印。网络解决方案也可以工作,但这需要更多的工作;先试试这个。

答案 4 :(得分:0)

你可以做的是每个线程有一个队列,并让日志记录线程经常遍历每个队列并在某处发布消息。

这很容易设置,并且争用的数量可能非常低(只需一个指针交换或两个,这可以通过锁定任何东西来完成)。