Interlocked.Decrement Método

Definición

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

Sobrecargas

Decrement(Int64)

Disminuye el valor de la variable especificada y almacena el resultado, como una operación atómica.

Decrement(Int32)

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

Decrement(UInt32)

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

Decrement(UInt64)

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

Decrement(Int64)

Source:
Interlocked.CoreCLR.cs
Source:
Interlocked.CoreCLR.cs
Source:
Interlocked.CoreCLR.cs

Disminuye el valor de la variable especificada y almacena el resultado, como una operación atómica.

public static long Decrement (ref long location);

Parámetros

location
Int64

Variable cuyo valor se va a reducir.

Devoluciones

Valor de la variable inmediatamente después de que finalice la operación de decremento.

Excepciones

La dirección de location es un puntero null.

La dirección de location es un puntero null.

Comentarios

Este método controla una condición de desbordamiento ajustando: si location = Int64.MinValue, location - 1 = Int64.MaxValue. No se inicia ninguna excepción.

Consulte también

Se aplica a

.NET 9 y otras versiones
Producto Versiones
.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)

Source:
Interlocked.CoreCLR.cs
Source:
Interlocked.CoreCLR.cs
Source:
Interlocked.CoreCLR.cs

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

public static int Decrement (ref int location);

Parámetros

location
Int32

Variable cuyo valor se va a reducir.

Devoluciones

Valor de la variable inmediatamente después de que finalice la operación de decremento.

Excepciones

La dirección de location es un puntero null.

La dirección de location es un puntero null.

Ejemplos

En el ejemplo siguiente se determina cuántos números aleatorios van de 0 a 1000 para generar 1000 números aleatorios con un valor de punto medio. Para realizar un seguimiento del número de valores de punto medio, una variable, midpointCount, se establece igual a 1000 y se disminuye cada vez que el generador de números aleatorios devuelve un valor de punto medio. Dado que tres subprocesos generan los números aleatorios, Decrement(Int32) se llama al método para asegurarse de que varios subprocesos no se actualizan midpointCount simultáneamente. Tenga en cuenta que también se usa un bloqueo para proteger el generador de números aleatorios y que se usa un CountdownEvent objeto para asegurarse de que el método no finaliza la Main ejecución antes de los tres subprocesos.

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

El ejemplo siguiente es similar al anterior, salvo que usa la Task clase en lugar de un procedimiento de subproceso para generar 50 000 enteros de punto medio aleatorios. En este ejemplo, una expresión lambda reemplaza el procedimiento de GenerateNumbers subproceso y la llamada al Task.WaitAll método elimina la necesidad del CountdownEvent objeto .

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

Comentarios

Este método controla una condición de desbordamiento ajustando: si location = Int32.MinValue, location - 1 = Int32.MaxValue. No se inicia ninguna excepción.

Consulte también

Se aplica a

.NET 9 y otras versiones
Producto Versiones
.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)

Source:
Interlocked.cs
Source:
Interlocked.cs
Source:
Interlocked.cs

Importante

Esta API no es conforme a CLS.

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

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

Parámetros

location
UInt32

Variable cuyo valor se va a reducir.

Devoluciones

Valor de la variable inmediatamente después de que finalice la operación de decremento.

Atributos

Excepciones

La dirección de location es un puntero null.

Se aplica a

.NET 9 y otras versiones
Producto Versiones
.NET 5, 6, 7, 8, 9

Decrement(UInt64)

Source:
Interlocked.cs
Source:
Interlocked.cs
Source:
Interlocked.cs

Importante

Esta API no es conforme a CLS.

Disminuye el valor de una variable especificada y almacena el resultado, como una operación atómica.

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

Parámetros

location
UInt64

Variable cuyo valor se va a reducir.

Devoluciones

Valor de la variable inmediatamente después de que finalice la operación de decremento.

Atributos

Excepciones

La dirección de location es un puntero null.

Se aplica a

.NET 9 y otras versiones
Producto Versiones
.NET 5, 6, 7, 8, 9