Daher auch meine Frage @Helmut: in C++ ist
volatile nämlich KEINE Thread-Sicherheit. Und in C# anscheinend auch nicht. Es ist nur ein Hinweis an den Compiler, dass sich diese Variable auf Wegen ändern wird, die der Compiler nicht vorhersehen kann. In dem Beispielcode
|
Quellcode
|
1
2
|
while (mResolvedStack)
Thread.Sleep(10);
|
würde ein schlauer Compiler, wenn er den Inhalt von Thread.Sleep() überschauen kann und feststellt, dass dort nirgends mResolvedStack geändert wird, die while-Bedingung rausoptimieren. Es hat ja keinen Sinn, bei jedem Durchlauf erneut zu testen, wenn nichts von dem Code in der Schleife die Variable verändern kann. Daher *muss* man an dieser Stelle das "mResolvedStack" als
volatile deklariert werden oder Du bekommst interessante Bugs im Release Build. Das heißt aber nicht, dass der Zugriff auf mResolvedStack deswegen atomar ist und sicher aus mehreren Threads heraus geschrieben/gelesen werden kann. Du musst (sowohl in C++ als auch in C#) immernoch manuell locken oder einen atomaren Datentyp benutzen.