2016-11-29 54 views
5

我有如下所示的一些代码:C++一个原子阵列是否也需要是原子的?

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

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

std::atomic<KBuffer*>* messages; 

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

回答

3

但这是否数组指针本身也需要是原子?

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

在构造函数完成后,另一个线程是否可以尝试访问一条消息,只发现消息还没有被赋值?

这是你的工作,使多个线程无法访问该类,直到它完全初始化。之后,它应该没问题。