c++ - 线程安全数据和线程安全容器

标签 c++ visual-c++ stl

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

最佳答案

线程安全数据:

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

  • 如果已采取措施确保:

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

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

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

线程安全容器:

  • 容器是否有适当的措施来确保对它们所做的任何更改都以线程安全的方式发生。

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

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

关于c++ - 线程安全数据和线程安全容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/999699/

相关文章:

c++ - `std::vector<primitive>::clear()` 是常数时间操作吗?

c++ - 使用 boost 将命名空间添加到 XML

c++ - 如何从安装的文件夹中读取文件c/c++

c++ - 每 block 奖励少于 1 个硬币的比特币 fork

c++ - cocos2d-x 3 如何让 Sprite 吞掉所有接触它的东西

c++ - 消息框错误

c++ - 如何在 C++ 中使用指针从数组中删除最后一个元素?

c++ - 如何从 Visual C++ 中的版本资源中读取

c++ - 在 std::multiset 中,如果找到一个元素,是否有一种函数或算法可以只删除一个样本(单一或重复)

传递 container.start() 和 container.end() 的 C++ 更简洁的替代方法