流是一种强大的数据处理抽象机制,它允许你调用泛型的读/写函数,不必关心数据从什么地方来、到什么地方去。使用流,同样的代码可从控制台、文件、套接字等地方读取数据。
C++将流的强大能力与运算符重载合并到一起,为我们提供了>>和<<运算符,以便从流中读取,以及向流中写入,如清单A所示。
向流中写入通常不是“线程安全”(thread-safe)的。事实上,即便是fread和fwrite这样的基元函数,也不要求是线程安全的。不过,使用正确实现的标准模板库(STL)流,不仅能继续发挥流简单易用的特点,还能保证代码的线程安全。另外,你以前使用了<<运算符的代码仍可继续使用,所有线程安全问题都会在幕后解决。
从表面看,清单B应该在控制台上打印以下结果:
message from thread 1
message from thread 2
但它实际输出的是:
message from message from thread 2
thread 1
这是因为在第一个线程成功打印message和from之后,第二个线程将接管控制权,打印它的完整的消息。之后,第一个线程继续打印它尚未完成打印的内容。这个简单的例子演示了假如代码不是线程安全的,可能有什么后果。