Ich versuche, Bit-Flags in einer freigegebenen Variablen innerhalb einer Multithread-.NET-Anwendung zu setzen, konnte jedoch keine Parallele zur ursprünglichen InterlockedOr-Funktion in der verwalteten Interlocked Klasse finden . Ich habe eine für die Durchführung mit dem folgenden Code kommen | = Zuweisung, aber die theoretische Möglichkeit einer unendlichen Schleife macht mich unbequem:Implementierung einer bitweisen Operation mit der Interlocked-Klasse in .NET
long currentValue;
long updatedValue;
do
{
// Spin until successful update. Value must be read using Interlocked.Read()
// to be truly atomic on 32 bit systems (see MSDN).
currentFlags = Interlocked.Read(ref _currentFlags);
updatedValue = currentFlags | flag;
} while (currentFlags != Interlocked.CompareExchange(ref _currentFlags, updatedValue, currentFlags));
Kann dies in einer sichereren Art und Weise implementiert wird nur die Funktionen eingebaut in die Interlocked-Klasse? Ich würde gerne eine Lösung mit einer expliziten Sperre vermeiden, wenn möglich.
Während es die Möglichkeit einer Endlosschleife bei der Verwendung von 'CompareExchange' gibt, ist es so unwahrscheinlich, dass es gefunden wird, dass es ignoriert werden kann. Das .NET Framework verwendet diese Technik umfassend, einschließlich aller gleichzeitigen Sammlungen, um eine lockfreie Synchronisation zu erreichen. –
Sie würden nur dann eine Endlosschleife erhalten, wenn ein anderer Thread das Flag gleichzeitig auf Null zurücksetzt und agil genug ist, um Ihren Thread jedes Mal für eine unendliche Anzahl von Versuchen zu schlagen. Wenn das passiert, müssen Sie größere Probleme lösen und herausfinden, warum der "agile" Thread das tut, was er tut. Ich denke Ihre Lösung ist so gut wie es mit 'Interlocked' möglich ist. – dasblinkenlight