Auf Englisch lesen

Freigeben über


Interlocked.Decrement Methode

Definition

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

Überlädt

Decrement(Int64)

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

Decrement(Int32)

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

Decrement(UInt32)

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

Decrement(UInt64)

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

Decrement(Int64)

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

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

public static long Decrement (ref long location);

Parameter

location
Int64

Die Variable, deren Wert dekrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Dekrementvorgangs.

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

Die Adresse von location ist ein null-Zeiger.

Hinweise

Diese Methode behandelt eine Überlaufbedingung, indem sie folgendes umgibt: if location = Int64.MinValue, location - 1 = . Int64.MaxValue Es wird keine Ausnahme ausgelöst.

Weitere Informationen

Gilt für:

.NET 9 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
.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

Decrement(Int32)

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

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

public static int Decrement (ref int location);

Parameter

location
Int32

Die Variable, deren Wert dekrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Dekrementvorgangs.

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

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 Mittelwerte nachzuverfolgen, wird eine Variable , , gleich 1.000 festgelegt und jedes Mal dekrementiert, midpointCountwenn der Zufallsgenerator einen Mittelwert zurückgibt. Da drei Threads die Zufallszahlen generieren, wird die Decrement(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.

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 = 10000;

   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.Decrement(ref midpointCount);
            midpt++;
         }
         total++;    
      } while (Volatile.Read(ref midpointCount) > 0);
      
      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: 3,204,021
//          Midpoint values: 3,156 (0.099 %)
//       Thread Thread0:
//          Random Numbers: 4,073,592
//          Midpoint values: 4,015 (0.099 %)
//       Thread Thread1:
//          Random Numbers: 2,828,192
//          Midpoint values: 2,829 (0.100 %)
//       
//       Total midpoint values:      10,000 (0.099 %)
//       Total number of values: 10,105,805

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.

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 = 50000;

   public static async Task 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.Decrement(ref midpointCount);
                                           midpt++;
                                        }
                                        total++;    
                                     } while (Volatile.Read(ref midpointCount) > 0);
                                          
                                     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); 
                                   } ));

      await Task.WhenAll(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 1:
//          Random Numbers: 24,530,624
//          Midpoint values: 24,675 (0.101 %)
//       Task 2:
//          Random Numbers: 7,079,718
//          Midpoint values: 7,093 (0.100 %)
//       Task 3:
//          Random Numbers: 18,284,617
//          Midpoint values: 18,232 (0.100 %)
//       
//       Total midpoint values:      50,000 (0.100 %)
//       Total number of values: 49,894,959

Hinweise

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

Weitere Informationen

Gilt für:

.NET 9 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
.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

Decrement(UInt32)

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

Wichtig

Diese API ist nicht CLS-kompatibel.

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

[System.CLSCompliant(false)]
public static uint Decrement (ref uint location);

Parameter

location
UInt32

Die Variable, deren Wert dekrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Dekrementvorgangs.

Attribute

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

Gilt für:

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

Decrement(UInt64)

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

Wichtig

Diese API ist nicht CLS-kompatibel.

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

[System.CLSCompliant(false)]
public static ulong Decrement (ref ulong location);

Parameter

location
UInt64

Die Variable, deren Wert dekrementiert werden soll.

Gibt zurück

Der Wert der Variablen unmittelbar nach Abschluss des Dekrementvorgangs.

Attribute

Ausnahmen

Die Adresse von location ist ein null-Zeiger.

Gilt für:

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