将互斥锁放在日志记录类中的位置?

时间:2013-11-05 15:28:11

标签: c++ linux queue mutex

首先,由于我使用过任何类型的互斥锁或信号量,已经有一段时间了,所以请放轻松。

我已经实现了一个通用的日志记录类,它现在只接收来自其他类的消息,并在该消息前面添加日期/时间和调试级别,然后将消息打印到stdout。

我想实现某种队列或缓冲区,它将保存许多发送到日志记录类的消息,然后将它们写入文件。

我遇到的问题是我无法决定如何/在哪里保护队列。

以下是我到目前为止所提出的一些伪代码:

logMessage(char *msg, int debugLevel){
    formattedMsg = formatMsg(msg, debugLevel) //formats the msg to include date/time & debugLevel
    lockMutext()
    queue.add(formattedMsg)
    unlockMutex()
}

wrtieToFile(){
    if (isMessageAvailable()) { //would check to see if there is a message in the queue
        lockMutext()
        file << queue.getFirst() //would append file with the first available msg from the queue
        unlockMutex()
    }
}

我的问题是:

  • 我真的需要在两个地方使用互斥锁吗?
  • 我正在寻找一种互斥体吗?
  • 我想我可能需要一个线程来写文件部分 - 这听起来像个好主意吗?

仅供参考我在不使用Boost或任何第三方库的情况下寻找方法。

编辑目标平台是Linux。

编辑2 将formatMsg移至互斥锁之前(谢谢@Paul Rubel)

3 个答案:

答案 0 :(得分:2)

关于你真的需要互斥锁吗?想想如果你没有锁定东西会发生什么。除非您的队列是线程安全的,否则您可能需要保护插入和删除。

想象一下,在删除第一个元素时,执行上下文会发生变化。添加可以找到处于不一致状态的队列,然后谁知道会发生什么。

关于创建消息,除非formatMsg使用共享资源,否则你可能会更多地使用锁定部分,这可以增加你的并行性。

将写入文件提取到自己的线程听起来像是一个合理的选择,这样日志记录线程就不必自己进行调用。

答案 1 :(得分:1)

如果我错了,请纠正我。来自多个线程的多个调用者都试图同时访问相同的资源。

也许您可以只使用一个互斥锁包装整个日志记录功能。

注意竞争条件。

修改 读者可以看一下对这个答案的评论,以进行一些有价值的讨论

答案 2 :(得分:0)

您可以定义一个全局变量,其中包含队列或缓冲区中存在的元素数。这意味着您需要increment or decrement此变量,而adding dataremoving data来自缓冲区或队列。因此,您将此变量保留在上述日志记录框架的mutex内。