Initialisierung des Atomvektors

Initialisierung des Atomvektors

Sie haben recht, sich Sorgen zu machen. Standardmäßig haben die Atomics den Default-Konstruktor aufgerufen, jedoch nicht als solche initialisiert worden. Dies liegt daran, dass der Standardkonstruktor das atomare:

nicht initialisiert

Dies verstößt etwas gegen die normalen Sprachregeln, und einige Implementierungen werden trotzdem initialisiert (wie Sie bemerkt haben).

Abgesehen davon würde ich empfehlen, den zusätzlichen Schritt zu unternehmen, um zu 100 % sicherzustellen, dass sie gemäß dem Standard korrekt initialisiert werden - schließlich haben Sie es mit Parallelität zu tun, bei der Fehler extrem schwer aufzuspüren sein können.

Es gibt viele Möglichkeiten, das Problem zu umgehen, einschließlich der Verwendung von Wrapper:

struct int_atomic {
   std::atomic<int> atomic_{0};//use 'initializing' constructor
};

Selbst wenn der Standardkonstruktor aufgerufen würde (ist es nicht, weil es trivial ist), macht es nicht wirklich etwas.

Es kann offensichtlich nicht garantiert werden, dass eine Nullinitialisierung ein gültiges Atom erzeugt; das funktioniert nur zufällig ein gültiges atomisches Element wird erstellt, indem alle seine Mitglieder mit Null initialisiert werden.

Und da atomare Elemente nicht kopierbar sind, können Sie im Vektorkonstruktor keinen Initialisierungswert angeben.

Sie sollten jetzt den Container und std::atomic_init durchlaufen jedes Element. Wenn Sie dies umgehen müssen, ist das in Ordnung, da Sie aus demselben Grund bereits die Erstellung des Vektors synchronisieren.