数组上的多线程/这里需要锁定机制吗?
Multithreading on arrays / Do I need locking mechanisms here?
我正在编写多线程应用程序。该应用程序包含一个长度数组,假设为 1000。
如果我现在有两个线程并且我要确保线程 1 将只访问元素 0-499 而线程 2 将只访问元素 500-999,我是否需要一个锁定机制来保护数组或者那样就好了。
注意:计算时只会改变数组的内容!该数组不会被移动、memcpy
ed 或以其他方式改变而不是改变数组内部的元素。
你要的完全没问题!这些策略(与一堆低级原子原语融合在一起)是所谓的无锁编程.
的基础
实际上,在实施此解决方案时可能会出现问题。您必须强烈保证您提到的属性。
确保您的内存数据数组永远不会移动。您不能依赖大多数 std
容器。它们中的大多数在修改过程中可能会发生显着变化。 std::map
正在重新平衡内部树并使一些内部指针无效。 std::vector
插入时有时会重新分配整个容器。
确保您拥有的任何数据只有一个消费者和一个生产者。每个消费者都必须将内部迭代器存储在有效状态,以防止读取相同的项目两次,或跳过某些项目。每个生产者必须将数据放在有效的地方,不可能覆盖现有的,而不是读取的数据。
违反此规则的任何将导致您需要实施互斥锁。
我正在编写多线程应用程序。该应用程序包含一个长度数组,假设为 1000。
如果我现在有两个线程并且我要确保线程 1 将只访问元素 0-499 而线程 2 将只访问元素 500-999,我是否需要一个锁定机制来保护数组或者那样就好了。
注意:计算时只会改变数组的内容!该数组不会被移动、memcpy
ed 或以其他方式改变而不是改变数组内部的元素。
你要的完全没问题!这些策略(与一堆低级原子原语融合在一起)是所谓的无锁编程.
的基础实际上,在实施此解决方案时可能会出现问题。您必须强烈保证您提到的属性。
确保您的内存数据数组永远不会移动。您不能依赖大多数
std
容器。它们中的大多数在修改过程中可能会发生显着变化。std::map
正在重新平衡内部树并使一些内部指针无效。std::vector
插入时有时会重新分配整个容器。确保您拥有的任何数据只有一个消费者和一个生产者。每个消费者都必须将内部迭代器存储在有效状态,以防止读取相同的项目两次,或跳过某些项目。每个生产者必须将数据放在有效的地方,不可能覆盖现有的,而不是读取的数据。
违反此规则的任何将导致您需要实施互斥锁。