Ist es wohldefiniertes Verhalten, ein Element eines Arrays zu ändern, während ein anderes ein anderes Element desselben Arrays verändert?

8

Wenn ein Array vom Typ foo_t[n] und eine Menge von n Threads verwendet werden, wobei jeder der n Threads ein anderes Element des Arrays liest und ändert, mache ich müssen Änderungen des Arrays explizit synchronisiert werden, oder kann ich annehmen, dass das gleichzeitige Ändern von Elementen des Arrays ein wohldefiniertes Verhalten ist? Ist es wichtig, wie groß foo_t ist / welche Ausrichtung es hat?

    
fuz 21.06.2014, 23:28
quelle

1 Antwort

5

Was ich versuche, ist wohldefiniertes Verhalten.

Siehe ISO / IEC 9899: 2011 §5.1.2.4.27:

  

HINWEIS 13 Compiler-Transformationen, die Zuweisungen zu einem möglicherweise gemeinsam genutzten Speicherort einführen, der nicht von der abstrakten Maschine geändert wird, werden von diesem Standard im Allgemeinen ausgeschlossen, da eine solche Zuweisung in Fällen, in denen eine Zusammenfassung vorliegt, eine andere Zuweisung durch einen anderen Thread überschreiben könnte Die Ausführung der Maschine wäre nicht auf ein Datenrennen gestoßen. Dies umfasst Implementierungen von Datenelementzuweisungen, die benachbarte Elemente in separaten Speicherorten überschreiben. Wir schließen im Allgemeinen auch das Umordnen von atomaren Ladungen in Fällen aus, in denen die betreffenden Atome einen Aliasnamen annehmen können, da dies die Regeln der "sichtbaren Sequenz" verletzen könnte.

Beachten Sie, dass diese Sprache mit C11 eingeführt wurde, um Optimierungen vorzunehmen, die Fehler wie illegal machen. Pre-C11-Compiler halten sich möglicherweise nicht an diese Regel.

    
fuz 22.06.2014, 02:20
quelle