C++ 线程安全数据和线程安全容器

C++ 线程安全数据和线程安全容器,c++,visual-c++,stl,C++,Visual C++,Stl,大家好,我想知道线程安全数据和线程安全容器之间的区别是什么 通常指使用互斥锁、信号量或其他类似结构保护的数据 如果已采取措施确保: 它可以从多个线程以受控的方式进行修改,以确保生成的数据结构不会损坏,或导致代码中出现争用条件 它可以可靠地读取,而不会在读取过程中损坏数据。这对于使用迭代器的STL样式容器尤其重要 互斥锁通常通过在一个线程修改共享数据时阻止对其他线程的访问来工作。这也称为临界截面,是与临界截面一起使用的常见设计模式 根据CPU类型,某些基本数据类型(例如int)和操作(inc

大家好,我想知道线程安全数据和线程安全容器之间的区别是什么

  • 通常指使用互斥锁、信号量或其他类似结构保护的数据

  • 如果已采取措施确保:

    • 它可以从多个线程以受控的方式进行修改,以确保生成的数据结构不会损坏,或导致代码中出现争用条件
    • 它可以可靠地读取,而不会在读取过程中损坏数据。这对于使用迭代器的STL样式容器尤其重要
  • 互斥锁通常通过在一个线程修改共享数据时阻止对其他线程的访问来工作。这也称为临界截面,是与临界截面一起使用的常见设计模式

  • 根据CPU类型,某些基本数据类型(例如int)和操作(increment)可能不需要互斥保护(例如,如果它们解析为机器语言中的原子指令)。然而:

    • 对CPU体系结构做出任何假设都是不好的做法
    • 您应该始终进行防御性编码,以确保无论目标平台如何,代码都保持线程安全
线程安全容器

  • 容器应具有适当的措施,以确保以线程安全的方式对其进行任何更改

  • 例如,线程安全容器可能允许使用一组特定的公共方法插入或删除项,这些方法确保使用它的任何代码都是线程安全的

  • 换句话说,容器类将互斥保护作为一种服务提供给调用者,而用户不必自己滚动


@LeopardSkinPillBoxHat:如果只有一个目标平台怎么办。在保证原子指令的情况下减少互斥量安全吗?我认为你甚至不能保证原子指令。谁能说英特尔未来不会推出一种保证没有原子指令的新CPU?不太可能,但程序员的工作是确保代码保持平台/硬件独立。话虽如此,如果您可以保证不必要的互斥锁是绝对不必要的,那么删除不必要的互斥锁有很多好处,例如,由于阻塞较少,执行速度更快。但是您需要深入了解线程模型,才能知道是否可以安全地删除互斥保护。@Hat:如果英特尔推出这样一种处理器,那么他们的编译器团队将用手电筒和干草叉追击硬件人员。原因是C++0x包含整数类型的原子版本(通过std::atomic),为了提高效率,您希望尽可能在硬件中实现。对于无锁编程,std::atomic应该取代特定于平台的假设。请参阅Herb Sutter的“有效并发性”文章。@one by one:正如我所说,这样的处理器不太可能存在,但我的观点是程序员不应该依赖底层CPU实现来提供线程安全。我认为如果您知道您正在编写特定于平台的代码,以及“假设”,就可以了是CPU和编译器的文件化属性。最好是添加编译时检查,如果有人盲目地尝试移植您的代码,这些检查就会失败。例如,在x86上,int内存访问是原子的。依靠这一点(使用合适的断言)并不比使用内联x86 asm更糟糕。我同意默认情况下代码应该是可移植的,但并不认为编写不可移植的代码是“不好的做法”。