关于C++23中std::print()的线程安全性与文本交错问题咨询
关于C++23 std::print的线程安全与文本交错问题
线程安全(无数据竞争)
std::print是线程安全的,不存在数据竞争。根据C++23标准,所有针对标准输出流(std::print默认输出目标为stdout)的格式化输出操作,都满足数据竞争避免要求——不同线程对这些操作的并发执行不会触发未定义行为。
文本交错问题
你猜测的文本交错情况确实会发生。std::print的单个调用是原子性的:一次std::print输出的完整内容不会被其他线程的std::print调用打断,但多个独立的std::print调用之间没有隐式同步机制。
比如你示例中的场景,线程1的两次std::print调用、线程2的两次std::print调用,这四个操作的执行顺序是不确定的,完全可能出现类似如下的交错输出:
She sells The quick brown fox seashells by the seashore jump over the lazy dog
这和std::cout的行为完全一致:单个operator<<调用是原子的,但多次调用之间没有默认同步。
标准依据
C++23标准的**[format.output]**章节明确规定:
- 针对标准流的格式化输出函数,并发调用不会引入数据竞争;
- 每个格式化输出函数的调用会将整个输出序列作为一个整体写入流,不会被其他并发的格式化输出操作打断,但不同调用之间的执行顺序不做保证。
内容的提问来源于stack exchange,提问作者justANewb stands with Ukraine
相关产品推荐
相关产品推荐

