【问题标题】:Thread Safe Data and Thread Safe Containers线程安全数据和线程安全容器
【发布时间】:2009-06-16 05:18:37
【问题描述】:

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

【问题讨论】:

    标签: c++ visual-c++ stl


    【解决方案1】:

    线程安全数据

    • 一般指使用互斥锁信号量或其他类似结构保护的数据。

    • 如果已采取措施确保数据被认为是线程安全的:

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

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

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

    线程安全容器

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

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

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

    【讨论】:

    • @LeopardSkinPillBoxHat:如果只有一个目标平台怎么办。在保证原子指令的情况下减少互斥量是否安全?
    • 我认为你甚至不能保证原子指令。谁说 Intel 以后不推出保证没有原子指令的新 CPU?不太可能,但程序员的工作是确保代码保持平台/硬件独立。话虽如此,如果你能保证它们绝对没有必要,那么删除不必要的互斥锁是有好处的——例如由于阻塞较少,执行速度更快。但是您需要深入了解线程模型才能知道是否可以安全地移除互斥保护。
    • @Hat:如果英特尔要引入这样的处理器,那么他们的编译器团队将追逐那些手持火炬和干草叉的硬件人员。原因是 C++0x 包括整数类型的原子版本(通过 std::atomic),为了提高效率,您希望尽可能在硬件中实现。对于无锁编程,std::atomic 应该替换特定于平台的假设。请参阅 Herb Sutter 的“有效并发”文章。
    • @onebyone:正如我所说,这样的处理器不太可能存在,但我的观点是程序员不应该依赖底层 CPU 实现来提供线程安全。
    • 我认为只要你知道你正在编写特定于平台的代码就可以了,并且“假设”是 CPU 和编译器的记录属性。如果有人盲目地尝试移植您的代码,最好添加编译时检查。因此,例如在 x86 上,int 内存访问是原子的。依靠它(使用合适的断言)并不比使用内联 x86 asm 差。我同意默认情况下代码应该是可移植的,但并不是说编写不可移植的代码是“坏习惯”。
    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多