2016-11-29 88 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

但這是否數組指針本身也需要是原子?

一般來說,它取決於不同線程如何使用該指針。如果一個線程可能在其他人讀取時修改它,那麼是的。在你的情況不,你不需要它。假設你的程序是正確的(否則答案沒有任何意義),你不能使用你的類的實例,直到它完全構造,即構造函數完成。

在構造函數完成後,另一個線程是否可以嘗試訪問一條消息,只發現消息還沒有被賦值?

這是你的工作,使多個線程無法訪問該類,直到它完全初始化。之後,它應該沒問題。