2016-11-29 4 views
5

Ich habe einige Code wie folgt aus:C++ Muss ein Array von Atomen auch atomar sein?

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

Wo Meldungen Mitglied KMessageQueue ist, wie folgt definiert:

std::atomic<KBuffer*>* messages; 

So jedes Element in der Nachrichten-Array ist atomar, und ich las sie aus ein anderer Thread. Aber muss der Array-Zeiger selbst auch atomar sein? Kann ein anderer Thread versuchen, nach Abschluss des Konstruktors auf eine Nachricht zuzugreifen, um festzustellen, dass den Nachrichten noch kein Wert zugewiesen wurde?

Antwort

3

Aber muss der Array-Zeiger selbst auch atomar sein?

Im Allgemeinen hängt es davon ab, wie dieser Zeiger von verschiedenen Threads verwendet wird. Wenn ein Thread es ändern kann, wenn andere (s) lesen, dann ja. In deinem Fall nein, du brauchst es nicht. Angenommen, Ihr Programm ist korrekt (sonst ergibt die Antwort keinen Sinn), können Sie die Instanz Ihrer Klasse erst verwenden, wenn sie vollständig aufgebaut ist, dh der Konstruktor fertig ist.

Kann ein anderer Thread versuchen, auf eine Nachricht zuzugreifen, nachdem der Konstruktor abgeschlossen wurde, nur um festzustellen, dass den Nachrichten noch kein Wert zugewiesen wurde?

Es ist Ihre Aufgabe, diese Klasse durch mehrere Threads unzugänglich zu machen, bis sie vollständig initialisiert ist. Danach sollte es in Ordnung sein.

Verwandte Themen