Multithreading 使用std::atomic的并发阵列访问

Multithreading 使用std::atomic的并发阵列访问,multithreading,c++11,atomic,Multithreading,C++11,Atomic,我知道mutex同步是如何工作的,但在以下过于简化的情况下,我无法确定需要如何进行同步: 我们有一个包含10个元素的数组 线程1以只读方式-读取元素访问数组。e、 g.类似这样的情况: // const int *my_array; int something = my_array[5]; 线程2执行不相关的操作,但它可能会不时决定一次更新所有10个元素。e、 g.类似于: // const int *my_array; const int *my_temp_array = load_new_

我知道
mutex
同步是如何工作的,但在以下过于简化的情况下,我无法确定需要如何进行同步:

我们有一个包含10个元素的数组

线程1
以只读方式-读取元素访问数组。e、 g.类似这样的情况:

// const int *my_array;
int something = my_array[5];
线程2
执行不相关的操作,但它可能会不时决定一次更新所有10个元素。e、 g.类似于:

// const int *my_array;
const int *my_temp_array = load_new_data();
// suppose pointer memory are correct.
// because it is pointers, the following operation is instant
my_array = my_temp_array;
两个线程都需要使用原语,例如
std::unique\u lock

但是有没有一种方法可以通过
std::atomic
实现这一点呢


注:
正如Igor提到的:

如果线程1在数组上循环,线程2在中间翻转 循环的一半-处理一半旧元素和一半新元素可以吗? 谁为数组分配内存,何时由谁分配 解除分配


这个例子过于简单,我只对一般的线程同步感兴趣。这就是为什么元素数固定为10。另外,假设没有内存分配,可以处理一半旧元素和一半新元素。

如果旧内存不需要释放,
std::atomic
的工作方式如下

//global atomic ptr
std::atomic<int*> myarray = nullptr;

// Thread 1
const int * current_array = myarray;
// do something current_array[10]
int something = current_array[5];

// Thread 2
int * tmp_array = new int[10];
myarray = tmp_array;
//全局原子ptr
std::原子myarray=nullptr;
//线程1
常量int*当前数组=myarray;
//在当前数组中执行某些操作[10]
int something=当前_数组[5];
//线程2
int*tmp_数组=新int[10];
myarray=tmp_数组;

如果将
my_array
设置为
std::atomic
,那么您的代码应该可以像编写的那样工作。这里的“工作”意味着不分种族。如果没有更多细节,很难说它是否会实现正确的语义。例如,如果线程1在数组上循环,线程2将其在循环的中间翻转,那么处理半个旧元素和半个新元素是可以的吗?谁为数组分配内存,何时由谁释放?std::atomic您确定这足够了吗?我看到了一些无锁代码,它们正忙着等待
std::atomic
,例如
while(lock)