可以通过保证多个线程不会访问同一内存来避免锁定吗?

假设我有一个大数组,我想用多个线程处理内容。如果我将每个线程委托给一个特定的部分,保证没有重叠,那么假设线程不访问数组之外的任何其他内存,这是否消除了锁定的需要

类似这样的代码(伪代码):

全局数组[9000000];
做某事(块){
对于(i=chunk.start;i<chunk.end;i++)
//用数组做些什么
}
main(){
chunk1={开始:0,结束:5000000};
chunk2={开始:5000000,结束:9000000};
开始线程(线程1,做一些事情(chunk1));
启动线程(thread2,dou某事(chunk2));
等待加入(线程1);
等待加入(线程2);
//对修改后的数组执行其他操作
}

在符合标准的C++11编译器中,这是安全的[简介内存](§1.7):

内存位置可以是标量类型的对象,也可以是最大值
具有非零宽度的相邻位字段序列。[…]两个
执行线程(1.10)可以更新和访问单独的内存
不相互干扰的位置

C11在§3.14中给出了相同的保证(他们甚至使用了相同的措辞)

在C++03编译器中,标准并不能保证它可以工作,但如果编译器提供类似于扩展的保证,它仍然可以工作

发表评论