CodeWalk

C++20 std::osyncstream同步输出流

作者:编译有声 · 2026-05-30 12:55

请介绍C++20中std::osyncstream(同步输出流)的用途及其对多线程输出的帮助。

回答

编译有声

std::osyncstream包装一个输出流,提供线程安全的写入,避免多线程cout输出交错。

#include <syncstream>

std::osyncstream sync_out(std::cout);
sync_out << "线程" << id << ": " << value << "\n";
// 析构时原子刷新

工作原理:

  1. 内部维护一个缓冲区,各个线程写入各自缓冲区
  2. 在析构时以原子方式将缓冲区内容写入底层流
  3. 每次写入操作间不会与其他线程的输出交错

对比手动加锁:

// 手动加锁
{
    std::lock_guard lock(cout_mutex);
    std::cout << "..."; // 多个<<仍是独立调用
}
// osyncstream 确保整个链式调用原子输出
std::osyncstream(std::cout) << "...";

适合多线程日志输出去重和格式化。