使用线程通常是一个很好的解决方案,我们通过它有趣的结果。
需要记录的主线程准备日志字符串并将其传递给第二个线程。为了提供第二个线程,我们使用无锁队列+循环内存来尽量减少alloc/free和等待时间。
secon线程等待无锁队列可用。当它发现需要做一些工作时,无锁队列的一个新槽被消耗并记录数据。
使用单独的线程可以节省大量时间。
当我们决定使用secon线程后,我们不得不面对另一个问题。同一个程序(一个全文serach引擎)的许多事件必须全部记录在同一个文件中,以便在服务器的每个实例之间定期共享资源。
我们可以决定使用一个信号量或另一个syncornizing方法,但我们发现了另一个解决方案:第二个线程发送一个UDP数据包到本地日志服务器,该服务器侦听已知端口。该服务器读取每条消息并将其记录在文件上(服务器实际上是写入文件时唯一拥有该文件的服务器)。 UDP套接字本身授予日志的序列化。
我一直在使用这个解决方案超过10年,并且从未松动我的日志文件的单行,使用第二个线程我也为每个操作节省了大量的时间(我们用来记录大量的服务器接收到的任何单个命令的信息)。
HTH