2017-08-16 140 views
5

我想知道两个线程是否可以修改相同数组的元素。两个线程可以写入同一个数组的不同元素吗?

如果我已经unsigned char array[4],可以设置线程1和array[0]array[1]“A”及线程在没有问题同时设置array[2]array[3]至“B”?

+1

总是可以通过多个线程修改相同的*绝对*内存位置。 – JosephDoggie

+0

由于你没有设置任何相同的地址空间,我不认为你会遇到任何多线程问题。 – user3400223

+0

这取决于体系结构。你在用什么处理器? – templatetypedef

回答

2

根据定义,当1个或多个线程将数据写入到相同的位置在存储器中,而其他从中读取(竞争状态发生或写信给它)。每个修改不同数组元素的多个线程是否正在写入内存中的相同位置?答案是不。每个数组元素都有一个内存区域,这个区域在属于整个数组的区域内单独保留。因此,不同元素的修改不会写入任何相同的存储位置。

其实这个问题我问一个很长的时间以前here,并在我的博士研究的基础部分。我并行地安装了数百条曲线(最小二乘拟合),同时更新了由多个线程产生结果的单个数组。

+1

根据标准的“数据竞争”定义,对同一位置的多次写入可以自行产生数据竞争,而不会有任何并发​​读取器。除此之外,虽然我认为这个答案在提出的问题上是正确的,但它的措辞非常混乱。也许你的意思是说“[*] *单个数组的不同元素”? –

+0

@JohnBollinger你说得对。不过,我认为写作比阅读要求更高,这就是为什么如果阅读导致一场比赛,那么肯定写作也是如此(我改正/改进了我的答案)。我无法理解你的建议。请提出编辑,我会修改我的答案。 –

+0

我已经做了我建议的编辑。通过一切手段进一步编辑或恢复,如果你不喜欢它。我起初很犹豫,因为这是一个相当大的变化,但出于同样的原因,我不知道如何更紧凑地提出这样的编辑,因为我的第一次尝试没有充分表达我的意图。 –

1

在我遇到的所有系统上,将不同线程写入同一阵列的不同元素并不是一个功能问题。在某些系统上,由于不同内核上的线程访问同一缓存行中的数据,可能会导致性能问题。硬件将解决功能部分,但性能可能不好。

功能问题并没有启动,直到你想一个线程读取由另一个线程写入的数据。那时你需要一个机制(例如互斥锁,信号量,原子操作等)来确保写入的数据对所有其他线程都是可见的。

1

如果线程在同一内核上执行这将是一个串行写流程中,您将设置不同的字节,正如“线性”会在一个线程代码。但是,您不一定知道按照什么顺序(在正常情况下)。意思是按什么顺序执行的线程。

然而,如果写入从两个不同的核的高速缓存线将被标记的各核的高速缓存和写操作之间共享的发生将使用RFO消息宣布。这将影响性能。

所以,换句话说,保持写入到相同的核心,就像你可以在同一高速缓存行。

的更多信息可以在这里找到 - > What Every Programmer Should Know About Memory

/安德斯

相关问题