Auf Englisch lesen

Freigeben über


Interlocked.Increment Methode

Definition

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

Überlädt

Increment(UInt64)

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

Increment(UInt32)

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

Increment(Int32)

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

Increment(Int64)

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

Increment(UInt64)

Quelle:
Interlocked.cs
Quelle:
Interlocked.cs
Quelle:
Interlocked.cs

Wichtig

Diese API ist nicht CLS-kompatibel.

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

C#
[System.CLSCompliant(false)]
public static ulong Increment(ref ulong location);

Parameter

location
UInt64

Die Variable, deren Wert inkrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Inkrementvorgangs.

Attribute

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

Gilt für:

.NET 10 und andere Versionen
Produkt Versionen
.NET 5, 6, 7, 8, 9, 10

Increment(UInt32)

Quelle:
Interlocked.cs
Quelle:
Interlocked.cs
Quelle:
Interlocked.cs

Wichtig

Diese API ist nicht CLS-kompatibel.

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

C#
[System.CLSCompliant(false)]
public static uint Increment(ref uint location);

Parameter

location
UInt32

Die Variable, deren Wert inkrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Inkrementvorgangs.

Attribute

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

Gilt für:

.NET 10 und andere Versionen
Produkt Versionen
.NET 5, 6, 7, 8, 9, 10

Increment(Int32)

Quelle:
Interlocked.CoreCLR.cs
Quelle:
Interlocked.CoreCLR.cs
Quelle:
Interlocked.CoreCLR.cs

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

C#
public static int Increment(ref int location);

Parameter

location
Int32

Die Variable, deren Wert inkrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Inkrementvorgangs.

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

Beispiele

Das folgende Beispiel bestimmt, wie viele Zufallszahlen zwischen 0 und 1.000 erforderlich sind, um 1.000 Zufallszahlen mit einem Mittelwert zu generieren. Um die Anzahl der Mittelpunktwerte nachzuverfolgen, wird eine Variable , midpointCount, gleich 0 festgelegt und jedes Mal inkrementiert, wenn der Zufallszahlengenerator einen Mittelwert zurückgibt, bis er 10.000 erreicht. Da drei Threads die Zufallszahlen generieren, wird die Increment(Int32) Methode aufgerufen, um sicherzustellen, dass mehrere Threads nicht gleichzeitig aktualisiert werden midpointCount . Beachten Sie, dass eine Sperre auch zum Schutz des Zufallszahlengenerators verwendet wird und dass ein CountdownEvent Objekt verwendet wird, um sicherzustellen, dass die -Methode die Main Ausführung nicht vor den drei Threads beendet.

C#
using System;
using System.Threading;

public class Example
{
   const int LOWERBOUND = 0;
   const int UPPERBOUND = 1001;
   
   static Object lockObj = new Object();
   static Random rnd = new Random();
   static CountdownEvent cte;
   
   static int totalCount = 0;
   static int totalMidpoint = 0;
   static int midpointCount = 0;

   public static void Main()
   {
      cte = new CountdownEvent(1);
      // Start three threads. 
      for (int ctr = 0; ctr <= 2; ctr++) {
         cte.AddCount();
         Thread th = new Thread(GenerateNumbers);
         th.Name = "Thread" + ctr.ToString();
         th.Start();
      }
      cte.Signal();
      cte.Wait();
      Console.WriteLine();
      Console.WriteLine("Total midpoint values:  {0,10:N0} ({1:P3})",
                        totalMidpoint, totalMidpoint/((double)totalCount));
      Console.WriteLine("Total number of values: {0,10:N0}", 
                        totalCount);                  
   }

   private static void GenerateNumbers()
   {
      int midpoint = (UPPERBOUND - LOWERBOUND) / 2;
      int value = 0;
      int total = 0;
      int midpt = 0;
      
      do {
         lock (lockObj) {
            value = rnd.Next(LOWERBOUND, UPPERBOUND);
         }
         if (value == midpoint) { 
            Interlocked.Increment(ref midpointCount);
            midpt++;
         }
         total++;    
      } while (Volatile.Read(ref midpointCount) < 10000);
      
      Interlocked.Add(ref totalCount, total);
      Interlocked.Add(ref totalMidpoint, midpt);
      
      string s = String.Format("Thread {0}:\n", Thread.CurrentThread.Name) +
                 String.Format("   Random Numbers: {0:N0}\n", total) + 
                 String.Format("   Midpoint values: {0:N0} ({1:P3})", midpt, 
                               ((double) midpt)/total);
      Console.WriteLine(s);
      cte.Signal();
   }
}
// The example displays output like the following:
//       Thread Thread2:
//          Random Numbers: 2,776,674
//          Midpoint values: 2,773 (0.100 %)
//       Thread Thread1:
//          Random Numbers: 4,876,100
//          Midpoint values: 4,873 (0.100 %)
//       Thread Thread0:
//          Random Numbers: 2,312,310
//          Midpoint values: 2,354 (0.102 %)
//       
//       Total midpoint values:      10,000 (0.100 %)
//       Total number of values:  9,965,084

Das folgende Beispiel ähnelt dem vorherigen, mit dem Unterschied, dass es die Task -Klasse anstelle einer Threadprozedur verwendet, um 50.000 zufällige ganzzahlige Mittelpunkte zu generieren. In diesem Beispiel ersetzt ein Lambdaausdruck die GenerateNumbers Threadprozedur, und der Aufruf der Task.WaitAll -Methode beseitigt die Notwendigkeit des CountdownEvent Objekts.

C#
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

public class Example
{
   const int LOWERBOUND = 0;
   const int UPPERBOUND = 1001;
   
   static Object lockObj = new Object();
   static Random rnd = new Random();
   
   static int totalCount = 0;
   static int totalMidpoint = 0;
   static int midpointCount = 0;

   public static void Main()
   {
      List<Task> tasks = new List<Task>();
      // Start three tasks. 
      for (int ctr = 0; ctr <= 2; ctr++) 
         tasks.Add(Task.Run( () => { int midpoint = (UPPERBOUND - LOWERBOUND) / 2;
                                     int value = 0;
                                     int total = 0;
                                     int midpt = 0;
                                    
                                     do {
                                        lock (lockObj) {
                                           value = rnd.Next(LOWERBOUND, UPPERBOUND);
                                        }
                                        if (value == midpoint) { 
                                           Interlocked.Increment(ref midpointCount);
                                           midpt++;
                                        }
                                        total++;    
                                     } while (Volatile.Read(ref midpointCount) < 50000);
                                    
                                     Interlocked.Add(ref totalCount, total);
                                     Interlocked.Add(ref totalMidpoint, midpt);
                                    
                                     string s = String.Format("Task {0}:\n", Task.CurrentId) +
                                                String.Format("   Random Numbers: {0:N0}\n", total) + 
                                                String.Format("   Midpoint values: {0:N0} ({1:P3})", midpt, 
                                                              ((double) midpt)/total);
                                     Console.WriteLine(s); } ));
      
      Task.WaitAll(tasks.ToArray());
      Console.WriteLine();
      Console.WriteLine("Total midpoint values:  {0,10:N0} ({1:P3})",
                        totalMidpoint, totalMidpoint/((double)totalCount));
      Console.WriteLine("Total number of values: {0,10:N0}", 
                        totalCount);                  
   }
}
// The example displays output like the following:
//       Task 3:
//          Random Numbers: 10,855,250
//          Midpoint values: 10,823 (0.100 %)
//       Task 1:
//          Random Numbers: 15,243,703
//          Midpoint values: 15,110 (0.099 %)
//       Task 2:
//          Random Numbers: 24,107,425
//          Midpoint values: 24,067 (0.100 %)
//       
//       Total midpoint values:      50,000 (0.100 %)
//       Total number of values: 50,206,378

Hinweise

Diese Methode behandelt eine Überlaufbedingung durch Umbruch: if location = Int32.MaxValue, location + 1 = Int32.MinValue. Es wird keine Ausnahme ausgelöst.

Weitere Informationen

Gilt für:

.NET 10 und andere Versionen
Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0

Increment(Int64)

Quelle:
Interlocked.CoreCLR.cs
Quelle:
Interlocked.CoreCLR.cs
Quelle:
Interlocked.CoreCLR.cs

Inkrementiert den Wert einer angegebenen Variablen und speichert das Ergebnis in einer atomaren Operation.

C#
public static long Increment(ref long location);

Parameter

location
Int64

Die Variable, deren Wert inkrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Inkrementvorgangs.

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

Hinweise

Diese Methode behandelt eine Überlaufbedingung durch Umbruch: if location = Int64.MaxValue, location + 1 = Int64.MinValue. Es wird keine Ausnahme ausgelöst.

Weitere Informationen

Gilt für:

.NET 10 und andere Versionen
Produkt Versionen
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.6, 2.0, 2.1
UWP 10.0