当前位置:  开发笔记 > 编程语言 > 正文

写入数组中的不同偏移始终定义良好

如何解决《写入数组中的不同偏移始终定义良好》经验,为你挑选了1个好方法。

在这个问题中提出,同时写入char数组中的两个不同偏移量意味着数据竞争,因为某些处理器(如Alpha)没有字节寻址,因此很难实现这一点.

我当然看到这会大大减慢在alpha处理器上写入字节的速度(基本上涉及LL/SC),但据我了解C++标准,数组中的每个字段都是它自己的内存位置(尽管从阅读§1.7开始,我可以还将整个数组视为一个内存位置 - 这可能是这个问题归结为的原因).

所以基本上是以下伪代码

char arr[10]; // global field
Thread 1:
arr[1] = 0;
Thread 2:
arr[0] = 1;

是否根据C++ 14标准明确定义?



1> Vaughn Cato..:

从C++ 14标准(1.7/3):

两个或多个执行线程(1.10)可以更新和访问单独的存储器位置,而不会相互干扰.

之前定义的地方(强调我的)

存储器位置是标量类型的对象或相邻位域的最大序列,所有这些都具有非零宽度.

所以char数组的s是内存位置,但数组本身不是; 因此,写入不同chars的单独线程不会相互干扰.


@eran No.从这个答案中,只要你能保证每个线程读写不相交的字段,编译器就有责任确保没有任何中断.但是,接下来的问题是:没有字节寻址的处理器的编译器如何在C++ 14下有效地处理字节数组.根据我的个人政策,我不会接受另外6个小时左右的答案,让其他人有时间报名,但这对我来说似乎很好.
@eran:看起来似乎不可能一般地进行优化,但如果编译器可以确定没有其他线程可以访问该数组,那么它可以进行更多优化.例如,如果数组是局部变量,并且没有指向数组的指针存储到函数外部的内存或传递给其他函数,那么它可以假设没有其他线程可以访问该数组.
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有