gpt4 book ai didi

c++ - cout 是否同步/线程安全?

转载 作者:IT老高 更新时间:2023-10-28 11:53:06 27 4
gpt4 key购买 nike

一般来说,我假设流是不同步的,由用户来做适当的锁定。但是,像 cout 这样的东西在标准库中是否得到特殊处理?

也就是说,如果多个线程正在写入 cout,它们会破坏 cout 对象吗?我知道即使同步,您仍然会得到随机交错的输出,但是可以保证交错。也就是说,从多个线程中使用 cout 是否安全?

该供应商是否依赖于该供应商? gcc 是做什么的?


重要提示:如果您说"is",请为您的回答提供某种引用,因为我需要某种证明。

我关心的也不在于底层系统调用,这些都很好,但流在顶部添加了一层缓冲。

最佳答案

C++03 标准对此没有任何说明。当你无法保证某个东西的线程安全时,你应该把它当作不是线程安全的。

这里特别有趣的是 cout 是缓冲的。即使保证对 write 的调用(或在该特定实现中实现该效果的任何方法)是互斥的,缓冲区也可能由不同的线程共享。这将很快导致流的内部状态损坏。

即使保证对缓冲区的访问是线程安全的,你认为这段代码会发生什么?

// in one thread
cout << "The operation took " << result << " seconds.";

// in another thread
cout << "Hello world! Hello " << name << "!";

您可能希望这里的每一行都相互排斥。但是实现如何保证这一点?

在 C++11 中,我们确实有一些保证。 FDIS 在 §27.4.1 [iostream.objects.overview] 中说了以下内容:

Concurrent access to a synchronized (§27.5.3.4) standard iostream object’s formatted and unformatted input (§27.7.2.1) and output (§27.7.3.1) functions or a standard C stream by multiple threads shall not result in a data race (§1.10). [ Note: Users must still synchronize concurrent use of these objects and streams by multiple threads if they wish to avoid interleaved characters. — end note ]

因此,您不会得到损坏的流,但如果您不希望输出是垃圾,您仍然需要手动同步它们。

关于c++ - cout 是否同步/线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6374264/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com