Man*_*san 5 c++ logging locking
我们知道同步日志记录,将日志消息写入文件然后继续执行程序.异步记录器将日志消息排队并将它们写入单独的线程中.我开始在我的项目中实现Log4CPlus,我想到了几件事情.
我无法初始化更多LogObject,因为这将打开更多文件句柄,我们不需要它.(我知道我们应该使用基于特征的日志记录对象,例如UploadLogObj,DownloadLogOb,WebReqLogObj,AuthLogObj等).希望每次添加日志对象都可能会增加日志记录线程.
仍然为了论证,如果我使用单个日志对象并从多个线程推送日志消息,我想必须有一些互斥锁来防止写入消息队列.我的问题不是这个互斥锁会减慢进程,不会造成性能问题..?
我只是想知道异步记录器是如何工作的,我可以查看代码,这是一种方式.但希望答案对许多人来说都是有启发性的.
是的,互斥锁会稍微减慢进程速度,但是如果您从多个线程记录到同一目标,则无论如何都需要某种形式的同步,因为您不希望来自不同线程的行混合在一起。
最终,问题是决定在哪里同步,而不是是否同步。对于异步日志记录,当要记录的对象被推送到日志记录线程的队列时,就会发生这种情况。在同步情况下,可能在写入该行时(尽管这取决于实现)。
在第一种情况下,在互斥体中花费的时间将短得多且可预测,因为在互斥体中不会发生磁盘刷新。这意味着与第二种情况相比,您的性能下降可能更少,扩展也更好(加上您没有花在写入实际数据上的时间,因为另一个线程正在处理它)。
如果你没有很多线程竞争互斥锁,那么无论如何这都不会成为问题。不久前,我有机会为实时系统编写和使用异步记录器,并且我们早在同步问题之前就遇到了与磁盘带宽相关的问题。
异步日志记录的一个缺点是与内存更多相关:因为您需要传递要记录的数据,所以您需要小心并避免不必要的分配/解除分配。