C++ C++;11多线程:显示到控制台

C++ C++;11多线程:显示到控制台,c++,multithreading,c++11,C++,Multithreading,C++11,考虑一个函数,它接受100个数据元素的数组,并将它们打印到控制台 现在假设我在多核机器上启动两个函数线程。因为它是一台多核机器,所以很有可能两个线程在两个核上运行。因为两者都需要显示数据,所以控制台窗口之间存在竞争 现在,线程之间如何共享控制台 到达std::cout的线程首先显示整个数据,从而使其他线程暂停。? 或者控制台窗口的时间是在线程之间共享的。?如果是这样,那么是什么决定了线程的时间共享量呢?否,cout在C++11中不是线程安全的。你得自己安排 [准确地说,cout本身是线程安全的,

考虑一个函数,它接受100个数据元素的数组,并将它们打印到控制台

现在假设我在多核机器上启动两个函数线程。因为它是一台多核机器,所以很有可能两个线程在两个核上运行。因为两者都需要显示数据,所以控制台窗口之间存在竞争

现在,线程之间如何共享控制台

到达std::cout的线程首先显示整个数据,从而使其他线程暂停。?
或者控制台窗口的时间是在线程之间共享的。?如果是这样,那么是什么决定了线程的时间共享量呢?

否,
cout
在C++11中不是线程安全的。你得自己安排


[准确地说,
cout
本身是线程安全的,但只适用于调用本身的实际持续时间,典型的
cout行取决于您访问输入/输出流的方式:

§27.2.3螺纹安全[iostreams.螺纹安全]

1除非另有规定(27.4),否则多线程并发访问流对象(27.8、27.9)、流缓冲区对象(27.6)或C库流(27.9.2)可能会导致数据争用(1.10)。[注:数据争用导致未定义的行为(1.10)。-结束说明]

2如果一个线程进行库调用a,将值写入流,结果另一个线程通过库调用b从流中读取该值,这样不会导致数据争用,则a的写操作与b的读操作同步

另见§27.4.1

多线程对同步(27.5.3.4)标准iostream对象的格式化和未格式化输入(27.7.2.1)和输出(27.7.3.1)函数或标准C流的并发访问不得导致数据竞争(1.10)。[注:如果用户希望避免交叉字符,则必须由多个线程同步这些对象和流的并发使用。-结束注]


如果您使用这样的函数:

void justam(){
   std::cout << "One " << "two ";
}
void justam(){

std::cout通常不建议在大型程序中使用cout,人们更喜欢使用专用的日志记录,您可以将输出重定向到您喜欢的地方

通常,Boost是一个自然的候选,支持线程安全和非线程安全的记录器,并且几乎是标准的


Hmmm,是的,它是。所有输出都是序列化的。(它可能不是按照您期望的顺序,但是从多个线程插入
cout
的程序没有未定义的行为)对,所以
cout是的,您可以得到类似123321654\n456的东西。我只是反对使用“非线程安全”@R.MartinhoFernandes:是的,我添加了另一个段落来说明这一点。您可能也想引用§27.4.1。但是,
cout
仅仅是一个流对象,还是实际上是一个同步流对象?@R.MartinhoFernandes:默认情况下(您可以覆盖它)