2015-11-03 61 views
3

我在写一个多线程应用程序。该应用程序包含一个长度数组,如1000.数组上的多线程/我需要锁定机制吗?

如果我现在有两个线程,我会确保,线程1将只访问元素0-499,线程2只会访问元素500- 999,我需要一个锁定机制来保护阵列,否则会很好。

注意:只有数组的内容将在计算过程中更改!阵列不会被移动,memcpy编辑或以某种其他方式改变比阵列内的改变元素。

回答

2

你想要的是完美的!这些策略(与一堆低级原子基元融合在一起)是所谓的无锁编程的基础。

+0

非常感谢! – Nidhoegger

2

实际上,在实施此解决方案时可能存在问题。你必须强烈保证你提到的属性。

  1. 请确保您的内存数据数组永远不会移动。你不能依赖大多数std容器。他们中的大多数在修改期间可能会发生显着变化std::map正在重新平衡内部树,并使一些内部指针无效。 std::vector有时会在插入时重新分配整个容器。

  2. 确保只有一个消费者,并且只有一个生产者拥有您的任何数据。每个消费者必须以有效状态存储内部迭代器,以防止两次读取相同的项目,或者跳过某个项目。每个生产者必须将数据放在有效位置,而不可能覆盖现有的,未读取的数据。

任何的这个规则,不服从让你需要实现互斥。