2014-02-11 10 views
8

Ich kann über Gründe nachdenken, wenn es keine Rolle spielt, und eine Situation, in der Sie sie NICHT verwenden möchten, wenn Sie ein Design auf Verhalten mit nicht-atomaren Operationen testen möchten.Wann NICHT Atomic Operations verwenden?

Was sind andere Gründe? Insbesondere arbeite ich an einem Projekt mit seltenen Rennbedingungen, da ein Test keine atomaren Inkremente verwendet. Ich frage mich, warum sollte ich nicht immer atomare Inkremente verwenden, wenn eine Funktion dafür existiert?

Danke!

+0

Lassen Sie mich Ihre Frage auf Sie richten. Wenn Sie Ihr Programm so schreiben, dass Worker als neue * Prozesse * und nicht als neue * Threads * ausgegeben werden, müssen Sie sich keine Gedanken über atomare Aktualisierungen des Shared Memory machen, da Prozesse keinen Speicher freigeben. Anstatt zu fragen, warum nicht immer atomare Operationen verwenden? Wäre es nicht sinnvoll, stattdessen zu fragen, warum nicht immer Prozesse statt Threads ** verwenden? –

+0

Interessanter Punkt, nehme ich an, das Problem ist die gleiche Sache wie warum Atom nicht zu verwenden, Ressourcen wie Speicher/Geschwindigkeit sind begrenzt. –

Antwort

6

Weil Atomics langsamer sind. Sie verlangsamen den aufrufenden Thread, und sie können auch andere Threads verlangsamen, möglicherweise sogar solche, die nicht auf dieselben Atomics zugreifen. Sie können auch verhindern, dass der Compiler bestimmte Neuordnungsoptimierungen durchführt, die er andernfalls durchführen würde.

+1

Natürlich auch ... Nur die Verwendung von Atomics macht nichts, um die Thread-Sicherheit zu verbessern (und kann zu Deadlocks führen, wenn Sie die korrekte Analyse auslassen). –

+0

@JamesKanze, atomics sind nicht unbedingt lock-basierte – Leeor

+0

@Leeor Während das stimmt, sind sie auch nicht garantiert _not_ Sperren verwenden, und es gibt andere Möglichkeiten, um zu sperren (oder legen Sie alle aktiven Threads in busyloops, was nicht ist noch hilfreicher). Programmkorrektheit ist eine *** globale *** Eigenschaft. –

1

Atomare Operationen sind potenziell und wahrscheinlich teurer als ihr nichtatomares Äquivalent. In Fällen, in denen eine Synchronisierung zwischen Threads nicht erforderlich ist, z. B. beim Aktualisieren einer nicht freigegebenen lokalen Partition, wird durch die Atomizicy unnötiger Overhead verursacht, der vermieden werden sollte.