2016-11-29 61 views
5

は、私は、次のようないくつかのコードを持っている:C++アトミックの配列もアトミックである必要がありますか?

メッセージのように定義KMessageQueueのメンバーである
KMessageQueue::KMessageQueue() 
{  
    messages = new atomic<KBuffer*>[MAX_MESSAGES]; 
    for (int i = 0; i < MAX_MESSAGES; i++) 
     messages[i].store(nullptr); 
} 

std::atomic<KBuffer*>* messages; 

だからメッセージアレイ内の各要素は原子であり、そしてIはからそれらを読み取ります別のスレッド。 しかし、配列ポインタ自体もアトミックである必要がありますか?コンストラクタが完了した後に別のスレッドがメッセージにアクセスしようとしましたが、メッセージにまだ値が割り当てられていないことを発見するだけでしたか?

答えて

3

しかし、配列ポインタ自体もアトミックである必要がありますか?

一般に、そのポインタが異なるスレッドによってどのように使用されるかによって異なります。あるスレッドが他のスレッドがそれを読み取ったときにそれを変更する可能性がある場合は、yesを読み取ります。あなたのケースでは、あなたはそれを必要としません。あなたのプログラムが正しければ(そうでなければ答えは意味をなさない)、完全に構築されるまで、すなわちコンストラクタが終了するまで、クラスのインスタンスを使用することはできません。

他のスレッドがコンストラクタの完了後にメッセージにアクセスしようとしましたが、メッセージにまだ値が割り当てられていないことを発見しましたか?

完全に初期化されるまで、そのクラスに複数のスレッドがアクセスできないようにするのはあなたの仕事です。その後、それはうまくいくはずです。

関連する問題