首先,由于我使用过任何类型的互斥锁或信号量,已经有一段时间了,所以请放轻松。
我已经实现了一个通用的日志记录类,它现在只接收来自其他类的消息,并在该消息前面添加日期/时间和调试级别,然后将消息打印到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)
答案 0 :(得分:2)
关于你真的需要互斥锁吗?想想如果你没有锁定东西会发生什么。除非您的队列是线程安全的,否则您可能需要保护插入和删除。
想象一下,在删除第一个元素时,执行上下文会发生变化。添加可以找到处于不一致状态的队列,然后谁知道会发生什么。
关于创建消息,除非formatMsg使用共享资源,否则你可能会更多地使用锁定部分,这可以增加你的并行性。
将写入文件提取到自己的线程听起来像是一个合理的选择,这样日志记录线程就不必自己进行调用。
答案 1 :(得分:1)
也许您可以只使用一个互斥锁包装整个日志记录功能。
注意竞争条件。
修改强> 读者可以看一下对这个答案的评论,以进行一些有价值的讨论
答案 2 :(得分:0)
您可以定义一个全局变量,其中包含队列或缓冲区中存在的元素数。这意味着您需要increment or decrement
此变量,而adding data
或removing data
来自缓冲区或队列。因此,您将此变量保留在上述日志记录框架的mutex
内。