【发布时间】:2013-11-16 12:53:18
【问题描述】:
首先,我已经有一段时间没有使用任何类型的互斥锁或信号量了,所以请放轻松。
我已经实现了一个通用的日志记录类,它现在只接收来自其他类的消息,并在该消息前面加上日期/时间和调试级别,然后将消息打印到标准输出。
我想实现某种队列或缓冲区来保存许多发送到日志记录类的消息,然后将它们写入文件。
我遇到的问题是我无法决定如何/在哪里保护队列。
以下是我到目前为止所提出的一些伪代码:
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。
EDIT 2 将 formatMsg 移到互斥锁之前(谢谢@Paul Rubel)
【问题讨论】:
-
如果您存储消息的队列可以同时被不同的类随机访问,并且您的队列很常见,那么您将需要互斥锁或信号量。如果是这种情况,则在将消息写入队列之前获取互斥锁,并在完成后释放它。您在写入文件时也需要这个,即在写入之前获取锁,并在您完成写入消息后释放它。
-
queue.add 和 queue.getFirst 是否保证不抛出? (第一个不太可能。)如果不是,您缺少 lock_guard 或等效项将在异常情况下泄漏锁。