当年写多线程。
你第一次把日志打出来。
很可能会看到一盘炒面。
一行被撕成两半。
半行插进另一行。
你明明在排障。
结果先被日志整崩溃。
当年:cout 不是原子操作
你写。
std::cout << "A" << 1 << "\n";
你以为是一行。
但在多线程里。
它可能被拆成好几次写。
另一个线程刚好插进来。
你就得到混合输出。
线上啪一下:日志无法复现顺序,你以为是业务乱了
你写了个小项目。
两个线程同时处理请求。
你把关键路径都打了日志。
上线后。
你发现日志根本读不出来。
你以为是业务逻辑乱序。
其实只是输出互相穿插。
C++20:std::osyncstream
osyncstream 的思路很朴素。
你先把输出写进一个缓冲。
等你结束这一段。
它再一次性把整段刷到目标流。
这样别的线程就不容易插进来。
最小用法
#include <syncstream>
#include <iostream>
void log_line(int id) {
std::osyncstream out(std::cout);
out << "id=" << id << " ok\n";
}
你写的还是 <<。
但它更像“整行提交”。
你刚学 C++ 会卡:这是不是保证顺序
不保证全局顺序。
线程调度依然是线程调度。
它保证的是。
你的这一段输出不会被撕碎。
关键结论
并发日志最怕的不是多。
是乱。
osyncstream 至少帮你把“撕裂”这个问题收掉。
小结
你还是要思考并发。
但你至少不用再和 cout 打架。