gpt4 book ai didi

c++ - 将互斥锁放在日志类中的什么位置?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:40 27 4
gpt4 key购买 nike

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

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

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

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

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

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 或任何第 3 方库即可执行此操作的方法。

编辑目标平台是 Linux。

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

最佳答案

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

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

关于创建消息,除非 formatMsg 使用共享资源,否则您可能可以将其从锁定部分中取出,这可以提高并行度。

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

关于c++ - 将互斥锁放在日志类中的什么位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19792547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com