2.2TBB 并发容器
2.2.1STL 容器的缺点
许多开发者依靠手工编写容器类或使用由 标准模板库(,"()实现的容器类,可惜
的是,这些库大多数都不是线程安全的,具体来说,当在多线程代码中使用 ,"( 时,,"( 规
范中并未提及线程或容器类的行为,因此,这些 ,"( 容器类的实现一般都不是线程安全的。
口说无凭,下面请判断使用 ,"(0/12之后的值:
<
<<<<<<<<即便与两个不同的 1 相关联的两个 3 在上述代码中被修改之后,大多数 ,"( 实
现也并未对正确性提供任何保证,如果同时执行这些操作又未进行同步,很可能会破坏
,又因为未对线程安全性有任何要求,访问两个不同的 都有可能导致数据损坏。
<<<<<<<<当然了,也可以另一种方式实现 ,"( 模板类来保证上述代码的线程安全,不巧的
是,某些常用 操作的顺序并不是以一种线程友好的方式来实现的,此时,当每个单独
的操作为线程安全时,代码中的顺序操作可能会导致不确定的结果,例如,如果两个线程
操作了以下代码 中的同一元素:
<
<<<<<<<<由 "#$ 执行的代码进行了两项操作:一是它调用了操作符 45以返回一个对
“167相联对象的引用,如果这个 1 不在 中,操作符 45会为与此 1 相联的 1
类型对象分配空间;二是操作符 8被调用以复制 1 的临时实例到由引用指向的对象
中。
<<<<<<<<所期望的结果是,要么“167不在 中,要么它与 19:的一个实例成对出现。
但是如果没有用户干预的同步,即便每个操作符本身是线程安全的,都会有可能出现其他
的结果。由 "#$6 调用的 方法可能会在 "#$ 中对操作符 45及 8的调用之间出