Heim > Backend-Entwicklung > C#.Net-Tutorial > Tipps zur Verwendung von Interlocked für atomare Operationen in C#

Tipps zur Verwendung von Interlocked für atomare Operationen in C#

黄舟
Freigeben: 2016-12-15 14:17:02
Original
3019 Leute haben es durchsucht

Was sind atomare Operationen?

Atom bedeutet ursprünglich „das kleinste Teilchen, das nicht weiter geteilt werden kann“, während atomare Operation „eine oder eine Reihe von Operationen, die nicht unterbrochen werden können“ bedeutet. . Wenn in C# mehrere Threads gleichzeitig eine bestimmte Variable bearbeiten, sollten wir atomare Operationen verwenden, um zu verhindern, dass der von mehreren Threads erhaltene Wert nicht der neueste Wert ist.

Zum Beispiel: int result = 0;

Multi-Thread A führt Ergebnis(0)+1 aus

Multi-Thread B führt Ergebnis(0)+1 aus gleichzeitig

Es ist also schwer zu sagen, ob das Endergebnis 1 oder 2 ist. Wenn zwei Threads gleichzeitig in der CPU rechnen, ist das Ergebnis 1. Offensichtlich ist dieses Ergebnis nicht das, was wir wollen. Natürlich können Sie Sperren verwenden, um die Einzigartigkeit der Multithread-Ausführung sicherzustellen, aber ihre Leistung ist der atomaren Operation weitaus unterlegen.

Verwenden Sie Interlocked für atomare Operationen:

Verwenden Sie die von .NET bereitgestellte Interlocked-Klasse, um atomare Operationen für einige Daten auszuführen. Es sieht aus wie eine Sperre, ist aber keine atomare Operation basieren auf der CPU selbst und sind nicht blockierend, sodass sie effizienter sind als Sperren.

Im Folgenden wird C#-Code verwendet, um atomare Operationen zu demonstrieren:

class Program
{
//全局变量
private static int _result;
//Main方法
static void Main(string[] args)
{
//运行后按住Enter键数秒,对比使用Interlocked.Increment(ref _result);与 _result++;的不同
  while (true)
{
Task[] _tasks = new Task[100];
int i = 0;
for (i = 0; i < _tasks.Length; i++)
{
_tasks[i] = Task.Factory.StartNew((num) =>
{
var taskid = (int)num;
Work(taskid);
}, i);
}
Task.WaitAll(_tasks);
Console.WriteLine(_result);
Console.ReadKey();
}
}
//线程调用方法
private static void Work(int TaskID)
{
for (int i = 0; i < 10; i++)
{
//_result++;
Interlocked.Increment(ref _result);
}
}
}
Nach dem Login kopieren


Kommentieren Sie die letzten beiden Codezeilen, wenn Sie ausführen obiger Code_ result++;mit Interlocked.Increment(ref _result); und führen Sie dann eine der Zeilen aus. Halten Sie nach dem Ausführen die Eingabetaste gedrückt und führen Sie sie einige Sekunden lang aus.

Bisher wurde die Rolle von Interlocked reflektiert. Laden Sie den Beispielquellcode dieses Artikels herunter: Interlocked_Sample.

Weitere Anweisungen zu atomaren Operationen: Führen Sie Zuweisungsanweisungen auf einer 32-Bit-CPU aus. und die maximale Breite der Datenübertragung beträgt 4 Byte. Daher handelt es sich bei der 32-Bit-CPU um eine atomare Operation, solange die Lese- und Schreiboperationen weniger als 4 Bytes umfassen. Daher sind Operationen von Typen wie bool und int selbst atomare Operationen. Die von Interlocked bereitgestellte atomare Operationsmethode wird durch die Kapselung funktionaler CPU-Anweisungen in der untersten Ebene vervollständigt.

Das Obige ist die vom Herausgeber vorgestellte Technik zur Verwendung von Interlocked für atomare Operationen. Ich hoffe, dass sie Ihnen hilfreich sein wird. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht Sie rechtzeitig. Weitere verwandte Artikel finden Sie auf der chinesischen PHP-Website (m.sbmmt.com)!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage