【发布时间】:2016-08-02 15:55:24
【问题描述】:
我正在 Qt 中编写一个多线程应用程序(多个线程具有自己的事件循环)。记录时,我希望记录器在日志中包含一个线程 ID(它们具有有意义的名称)。 Qt 默认记录器似乎无法做到这一点。 所以我有三个选择:
- 每个线程都自己进行日志记录(这涉及互斥锁,因此可能是最糟糕的方法,但我不确定)
- 有一个专用的记录器线程和其他线程直接将事件发布到其中(可能比 3 更快。)
- 同 2。但消息是通过信号/槽系统发送的(事实上,这也会导致发布事件)。
哪一个更好,一般来说最佳做法是什么?
在cmets提问后需要澄清的一些事情:
- QThread 有一个标准方法
postEvent(),即线程安全。
所以问题就变成了,记录器线程是否需要为每个事件做足够的工作来证明跨某种队列编组事件数据的成本是合理的
- 这就是问题的本质。我知道最好的答案是“测量!”,但目前该应用程序处于早期开发阶段,没有太多要测量的内容。此外,从一开始就选择正确的设计总是好的。
- 在我的例子中线程可能是个好主意:它是一个媒体播放器,所以有 GUI 线程、播放线程、DB/媒体库线程、网络线程池......换句话说,整个 Zoo 线程。
【问题讨论】:
-
您可能还需要同步专用日志线程(可能是隐式的,但来自其他线程的事件或帖子在某处排队,必须同步)。
-
在某种程度上,在所有情况下都需要同步(即互斥锁)。所以问题就变成了,记录器线程是否需要为每个事件做足够的工作来证明跨某种队列编组事件数据的成本是合理的,而不是仅仅在事件源线程上执行工作,并锁定足够长的时间来写入事件数据到公共输出。
-
@JesperJuhl 非并行日志记录改变了运行时行为,可能太多了(例如,当更高的日志级别用于调试某些行为然后消失时)。因为如果没有专用的日志记录线程,您必须在在写入日志条目时的整个时间内阻止其他线程进行日志记录,或者接受杂乱的混合日志,这往往很快就会变得无用。
-
记住:加入你的线程,如果它们是 pthread 的,记住只有一个参数被传递给你想调用的线程函数,所以如果你想传递的不是线程 ID,就取考虑到这种情况。进程同步,知道是否使用互斥锁,计数信号量和二进制信号量。并且没有互斥量与二进制信号量不同,我让你看看。
-
Qt 默认记录器似乎无法做到这一点。 你不能使用
qInstallMessageHandler来安装自定义日志消息处理程序,并在那里获取“唯一线程 ID”调用者,并将其添加到日志中?
标签: c++ multithreading qt logging