C++ 原子数组是不是也需要是原子的?

Posted

技术标签:

【中文标题】C++ 原子数组是不是也需要是原子的?【英文标题】:C++ Does an array of atomics also need to be atomic?C++ 原子数组是否也需要是原子的? 【发布时间】:2016-11-29 22:01:31 【问题描述】:

我有如下代码:

KMessageQueue::KMessageQueue()
    
    messages = new atomic<KBuffer*>[MAX_MESSAGES];
    for (int i = 0; i < MAX_MESSAGES; i++)
        messages[i].store(nullptr);

其中messages是KMessageQueue的成员,定义为:

std::atomic<KBuffer*>* messages;

所以消息数组中的每个元素都是原子的,我从另一个线程中读取它们。 但是数组指针本身也需要是原子的吗?在构造函数完成后,另一个线程会尝试访问消息,却发现消息还没有被赋值吗?

【问题讨论】:

【参考方案1】:

但是数组指针本身也需要是原子的吗?

通常,这取决于不同线程如何使用该指针。如果一个线程可以在其他线程读取时修改它,那么是的。在您的情况下,您不需要它。假设你的程序是正确的(否则答案没有任何意义)你不能使用你的类的实例,直到它完全构造,即构造函数完成。

能否在构造函数完成后,另一个线程尝试访问消息,却发现消息尚未被赋值?

在完全初始化之前,让多个线程无法访问该类是您的工作。之后应该就好了。

【讨论】:

以上是关于C++ 原子数组是不是也需要是原子的?的主要内容,如果未能解决你的问题,请参考以下文章

原子数组AtomicIntegerArray实现原理简析

JUC并发编程 -- 原子数组 & 原子更新器(字段更新器) & 原子累加器(LongAdder)

java并发 day04CAS 原子整数 原子引用 原子数组 字段更新器和原子累加器 unsafe CPU缓存结构 不可变类 final的原理

java并发 day04CAS 原子整数 原子引用 原子数组 字段更新器和原子累加器 unsafe CPU缓存结构 不可变类 final的原理

java并发 day04CAS 原子整数 原子引用 原子数组 字段更新器和原子累加器 unsafe CPU缓存结构 不可变类 final的原理

java并发 day04CAS 原子整数 原子引用 原子数组 字段更新器和原子累加器 unsafe CPU缓存结构 不可变类 final的原理