含mutex与scoped_lock的基础日志宏为何仍出现线程输出交错?
多线程日志输出混乱的修复方案
你的核心问题是宏里的static std::mutex是每个LOG2调用点独有的——不同地方调用LOG2时,每个调用位置都会生成一个独立的static锁,根本做不到跨线程互斥,这就是输出被破坏的原因。
修复步骤:
- 把mutex改成全局(或单例类成员)的,让所有线程调用
LOG2时共用同一把锁 - 确保
mynow()和msg表达式里没有未受保护的IO操作,否则这些操作会在锁生效前执行,依然会导致输出穿插
修改后的代码示例:
首先定义全局锁:
#include <mutex> std::mutex g_log_mutex; // 所有LOG2调用共用这一把锁
然后调整日志宏:
#define LOG2(msg) do { std::scoped_lock<std::mutex> lock(g_log_mutex); std::cout << mynow() << " " << std::boolalpha << msg << std::endl; } while (false)
补充说明:
- 原代码里的static mutex,在C++宏展开后,每个调用
LOG2的地方都会创建一个独立的static变量,不同线程用不同的锁,完全起不到同步作用。 - 如果日志调用非常频繁,全局锁可能会有性能瓶颈,但对于基础日志场景,这个方案足够解决输出混乱问题。
- 一定要检查
mynow()函数内部有没有cout输出,或者msg里会不会触发IO操作——这些都要被锁覆盖,否则还是会出现输出穿插。
内容的提问来源于stack exchange,提问作者rare77
相关产品推荐
相关产品推荐

