问题描述
logger 组件是一个静态库。应用程序(服务)加载大约 20 个 DLL。应用程序和 DLL 与静态记录器库链接。还有其他应用程序 (UI/CLI) 可以更新 Windows 上共享内存中的日志级别。
主应用程序和 DLL 从共享内存中读取日志级别并决定是否记录特定的日志语句。读取日志级别受命名互斥锁保护,这会带来巨大的性能损失。
使阅读日志级别轻量化的最佳方法是什么。
解决方法
就像@rustyx 建议的那样,使用 std::atomic<>
可能是您的最佳选择。缓存一致性协议会为您处理同步,而且速度会尽可能快,而无需您自己监控更改。
几点:
- 使其尽可能小,例如使用
atomic_uchar
。 - 通过
is_lock_free()
方法验证实现是无锁的。 - 验证它是无地址的,因为您需要将它保存在共享内存中(请查看您的编译器或标准库的文档)。
否则,如果 1. 原子开销对你来说太大,2. 日志级别几乎从不改变,3. 你不介意改变后的小“延迟”,那么你可以创建一个本地副本并拥有您每隔“一段时间”监视一次更改的事件队列。