C++ iostreams: Unexpected but legal multithreaded behaviour - Bert Hubert's writings
a day ago
- 调用 `std::ios_base::sync_with_stdio(false)` 不仅会禁用 C 标准 I/O 同步,还会取消标准 iostream 对象的线程安全性。
- 绑定的流(例如 `cin` 绑定到 `cout`)会导致隐藏的写操作:从 `cin` 读取时会刷新 `cout`,从而产生并发访问,即使只有一个线程直接写入 `cout`。
- 为避免单线程 `cout` 使用中的隐藏并发写入,可使用 `cin.tie(nullptr)` 解除绑定。
- 即使同步流也可能产生交错输出;多个 `<<` 操作不具备原子性保证,因此需要用户级锁定来实现清晰的输出。
- 对于多线程程序,最安全的方法是保持流同步(即避免使用 `sync_with_stdio(false)`)并用互斥锁保护所有输出。