2014-01-27 11 views
9

Ich versuche, eine grundlegende Array von Objekten zu verwenden, unter Verwendung von C++ 11 atomics, dh unter:Grund C++ Atome Array

// Atomic array 
std::atomic<Object*> *array = new std::atomic<Object*>[10]; 

// Storing old data 
array[0].store(oldObject); 

// Store the new data 
Object *newObject = new Object(); 
while(!array[0].compare_exchange_strong(oldObject,newObject)); 

Meine Frage ist, kann die CAS Operation fehlschlagen nur, wenn ein anderer Thread Ändern Sie das Array bei dem gleichen Index? Oder wird die CAS-Operation fehlschlagen, wenn ein Thread versucht, eine beliebige Position innerhalb des Arrays zu ändern? Letzteres ist das Verhalten, das ich während der Tests zu haben scheint. Wenn ja, gibt es eine bessere Möglichkeit, ein Array zu deklarieren, so dass sich die Änderung einzelner Zellen im Array nicht gegenseitig beeinflusst?

Danke.

+0

Wenn sich verschiedene atomare Objekte zufällig gegenseitig beeinflussen könnten, sehe ich nicht, wie Sie jemals in der Lage wären, sie zu programmieren. – usr

+0

Benötigen Sie ein Array (einen Block aus zusammenhängendem Speicher mit angrenzenden Daten) oder einen Container, der Indizes mit Daten verknüpft? – Yakk

Antwort

1

IIRC atomare Variablen in einer einzigen Cache-Zeile teilen sich die Sperre (auf x86 {, _ 64}).

Also vielleicht das Array erweitern und versuchen Variablen an jedem Ende, um das zu testen?