C ++共享库中的线程安全日志记录

时间:2010-02-09 06:20:43

标签: c++ logging multithreading shared-libraries

我在C ++中实现了多线程共享库(适用于Linux和Windows)。我想在库本身中添加日志记录机制。图书馆的来电者不知道这一点。日志文件是相同的所以我想知道如果多个进程正在使用我的库并尝试打开并登录到同一个日志文件,我怎么能设计线程安全日志记录。有什么建议吗?

3 个答案:

答案 0 :(得分:2)

您可以尝试使用log4cpp库。

答案 1 :(得分:1)

您的图书馆与客户端应用程序共享日志文件?如果是这样,绝对没有办法进行线程安全日志记录。客户端可以在呼叫时创建一个线程和日志。

否则,您有两种选择:

  1. 使用互斥锁。最简单的解决方案。
  2. 在创建/销毁库时创建/销毁创建/销毁的消息FIFO队列,其中包含一个无锁的日志记录线程(您可能能够使用互斥锁)。我希望你有一个init / deinit函数......
  3. 区别b / w 1和2是1,您为完整的I / O操作保留一个互斥锁。在第二种情况下,只有在队列后面推送消息时才持有互斥锁,如果你做得正确,这可以是一个常量操作。

答案 2 :(得分:1)

使用文件锁定。我相信fcntl符合POSIX标准,因此也适用于Windows。你的代码是否使用Posix调用?

使用fcntl,您应该能够锁定特定范围的字节。因此,如果您试图结束并尝试锁定您要写入的字节数,那么它应该非常快。要获得锁定,如果你没有获得锁定,你可以旋转,放弃CPU一小段时间。