我想知道两个线程是否可以修改同一个数组的元素。
如果我有unsigned char array[4]
,则可以将{1}}和array[0]
设置为'A',将thread2设置为array[1]
,将array[2]
设置为'{B'同时没有问题?
答案 0 :(得分:4)
根据定义,当一个或多个线程将数据写入内存中的相同位置而其他线程从中读取数据(或写入它)时,会发生竞争条件。每个修改不同数组元素的多个线程是否会写入内存中的相同位置?答案是不。每个数组元素都有一个内存区域,仅在归属于整个数组的区域内为其保留。因此,不同元素的修改不会写入任何相同的存储位置。
实际上我很久以前就问了这个问题here,并根据我的博士论文的一部分进行了研究。我并行安装了数百条曲线(最小二乘拟合),同时更新了一个由多个线程得到结果的数组。
答案 1 :(得分:1)
在我遇到的所有系统上,让不同的线程写入同一阵列的不同元素并不是一个功能问题。但是,在某些系统上,由于不同内核上的线程访问同一缓存行中的数据,因此可能会出现性能问题。硬件将解决功能部分,但性能可能不好。
在您希望一个线程读取另一个线程写入的数据之前,功能问题不会启动。那时你需要一种机制(例如互斥,信号量,原子操作等)来确保所有其他线程都可以看到写入的数据。
答案 2 :(得分:1)
如果线程在同一个内核上执行,那么它将是一个串行写入过程,您可以将不同的字节设置为'线性'代码将在一个线程中。但是,您不一定知道以什么顺序(在正常情况下)。这意味着什么线程在什么时候执行。
但是,如果写入发生在两个不同的内核中,则高速缓存行将在相应的内核高速缓存之间标记为共享,并且将使用RFO消息通知写入操作。这将影响表现。
因此,换句话说,尽可能多地保持写入同一内核中的同一缓存行。
可在此处找到更多信息 - > What Every Programmer Should Know About Memory
/安德斯