【发布时间】:2020-08-12 12:38:57
【问题描述】:
假设您有两个线程。第一个线程尝试使用std::dec 将整数打印为十进制:
std::cout << std::dec << 123 << std::endl;
第二个线程尝试使用std::hex 将整数打印为十六进制:
std::cout << std::hex << 0x321 << std::endl;
是否保证 123 将打印为十进制,而 0x321 将打印为十六进制?如果不是,我该如何在多线程环境中正确格式化std::cout?
C++20 有std::osyncstream。但是在 C++20 之前我们可以使用什么?
【问题讨论】:
-
这能回答你的问题吗? How to easily make std::cout thread-safe?
-
@bolov,如果使用有自己线程的第三方库怎么办?
-
如果没有一个互斥锁来包装对
std::cout的整个访问权限,或者一个临时缓冲区,然后只保护互斥锁的最终写入,就没有解决方案。如果您担心嵌入式中的临时缓冲区性能,请提供一个 custom allocator 到std::stringstream,它会预先分配最多n字节内联(在嵌入式缓冲区中),并且只会超过堆中的分配。 -
@anton_rh:如果我没看错的话,
osyncstream本身不会将cout更改为具有互斥属性。它是一种可以像同步流一样工作的类型。所以它不能解决你提出的第 3 方问题。
标签: c++ multithreading iostream