Interlocked.Increment Metódus

Definíció

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

Túlterhelések

Name Description
Increment(UInt32)

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

Increment(UInt64)

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

Increment(Int32)

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

Increment(Int64)

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

Increment(UInt32)

Forrás:
Interlocked.cs
Forrás:
Interlocked.cs
Forrás:
Interlocked.cs
Forrás:
Interlocked.cs
Forrás:
Interlocked.cs

Fontos

Ez az API nem CLS-kompatibilis.

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

public:
 static System::UInt32 Increment(System::UInt32 % location);
[System.CLSCompliant(false)]
public static uint Increment(ref uint location);
[<System.CLSCompliant(false)>]
static member Increment : uint32 -> uint32
Public Shared Function Increment (ByRef location As UInteger) As UInteger

Paraméterek

location
UInt32

Az a változó, amelynek értékét növelni kell.

Válaszok

A változó értéke közvetlenül a növekményes művelet befejezése után.

Attribútumok

Kivételek

A cím location egy null mutató.

A következőre érvényes:

Increment(UInt64)

Forrás:
Interlocked.cs
Forrás:
Interlocked.cs
Forrás:
Interlocked.cs
Forrás:
Interlocked.cs
Forrás:
Interlocked.cs

Fontos

Ez az API nem CLS-kompatibilis.

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

public:
 static System::UInt64 Increment(System::UInt64 % location);
[System.CLSCompliant(false)]
public static ulong Increment(ref ulong location);
[<System.CLSCompliant(false)>]
static member Increment : uint64 -> uint64
Public Shared Function Increment (ByRef location As ULong) As ULong

Paraméterek

location
UInt64

Az a változó, amelynek értékét növelni kell.

Válaszok

A változó értéke közvetlenül a növekményes művelet befejezése után.

Attribútumok

Kivételek

A cím location egy null mutató.

A következőre érvényes:

Increment(Int32)

Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

public:
 static int Increment(int % location);
public static int Increment(ref int location);
static member Increment : int -> int
Public Shared Function Increment (ByRef location As Integer) As Integer

Paraméterek

location
Int32

Az a változó, amelynek értékét növelni kell.

Válaszok

A változó értéke közvetlenül a növekményes művelet befejezése után.

Kivételek

A cím location egy null mutató.

Példák

Az alábbi példa azt határozza meg, hogy hány 0 és 1000 közötti véletlenszerű szám szükséges 1000 véletlenszerű szám létrehozásához egy középponti értékkel. A középpontértékek számának nyomon követéséhez a változó értéke 0, és minden alkalommal növekszik, midpointCountamikor a véletlenszerű számgenerátor egy középpontértéket ad vissza, amíg el nem éri a 10 000 értéket. Mivel három szál hozza létre a véletlenszerű számokat, a Increment(Int32) metódus meghívásával biztosítható, hogy több szál ne frissüljön midpointCount egyszerre. Vegye figyelembe, hogy a zárolás a véletlenszerű számgenerátor védelmére is szolgál, és CountdownEvent egy objektumot használ annak biztosítására, hogy a Main metódus ne fejezze be a végrehajtást a három szál előtt.

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
Imports System.Threading

Module Example
   Const LOWERBOUND As Integer = 0
   Const UPPERBOUND As Integer = 1001
   
   Dim lockObj As New Object()
   Dim rnd As New Random()
   Dim cte As CountdownEvent
   
   Dim totalCount As Integer = 0
   Dim totalMidpoint As Integer = 0
   Dim midpointCount As Integer = 0

   Public Sub Main()
      cte = New CountdownEvent(1)
      ' Start three threads. 
      For ctr As Integer = 0 To 2
         cte.AddCount()
         Dim th As New Thread(AddressOf GenerateNumbers)
         th.Name = "Thread" + ctr.ToString()
         th.Start()
      Next
      cte.Signal()
      cte.Wait()
      Console.WriteLine()
      Console.WriteLine("Total midpoint values:  {0,10:N0} ({1:P3})",
                        totalMidpoint, totalMidpoint/totalCount)
      Console.WriteLine("Total number of values: {0,10:N0}", 
                        totalCount)                  
   End Sub
   
   Private Sub GenerateNumbers()
      Dim midpoint As Integer = (upperBound - lowerBound) \ 2
      Dim value As Integer = 0
      Dim total As Integer = 0
      Dim midpt As Integer = 0
      Do
         SyncLock lockObj
            value = rnd.Next(lowerBound, upperBound)
         End SyncLock
         If value = midpoint Then 
            Interlocked.Increment(midpointCount)
            midpt += 1
         End If
         total += 1    
      Loop While midpointCount < 10000
      
      Interlocked.Add(totalCount, total)
      Interlocked.Add(totalMidpoint, midpt)
      
      Dim s As String = String.Format("Thread {0}:", Thread.CurrentThread.Name) + vbCrLf +
                        String.Format("   Random Numbers: {0:N0}", total) + vbCrLf +
                        String.Format("   Midpoint values: {0:N0} ({1:P3})", midpt, midpt/total)
      Console.WriteLine(s)
      cte.Signal()
   End Sub
End Module
' 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

Az alábbi példa az előzőhöz hasonló, azzal a kivételrel, hogy szálas eljárás helyett az Task osztályt használja 50 000 véletlenszerű középpont egész szám létrehozásához. Ebben a példában egy lambda kifejezés helyettesíti a GenerateNumbers szál eljárást, és a Task.WaitAll metódus meghívása megszünteti az CountdownEvent objektum szükségességét.

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
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks

Module Example
   Const LOWERBOUND As Integer = 0
   Const UPPERBOUND As Integer = 1001
   
   Dim lockObj As New Object()
   Dim rnd As New Random()
   
   Dim totalCount As Integer = 0
   Dim totalMidpoint As Integer = 0
   Dim midpointCount As Integer = 0

   Public Sub Main()
      Dim tasks As New List(Of Task)()
      ' Start three tasks. 
      For ctr As Integer = 0 To 2
         tasks.Add(Task.Run( Sub()
                                Dim midpoint As Integer = (upperBound - lowerBound) \ 2
                                Dim value As Integer = 0
                                Dim total As Integer = 0
                                Dim midpt As Integer = 0
                                Do
                                   SyncLock lockObj
                                      value = rnd.Next(lowerBound, upperBound)
                                   End SyncLock
                                   If value = midpoint Then 
                                      Interlocked.Increment(midpointCount)
                                      midpt += 1
                                   End If
                                   total += 1    
                                Loop While midpointCount < 50000
                              
                                Interlocked.Add(totalCount, total)
                                Interlocked.Add(totalMidpoint, midpt)
                              
                                Dim s As String = String.Format("Task {0}:", Task.CurrentId) + vbCrLf +
                                                  String.Format("   Random Numbers: {0:N0}", total) + vbCrLf +
                                                  String.Format("   Midpoint values: {0:N0} ({1:P3})", midpt, midpt/total)
                                Console.WriteLine(s)
                             End Sub ))
      Next

      Task.WaitAll(tasks.ToArray())
      Console.WriteLine()
      Console.WriteLine("Total midpoint values:  {0,10:N0} ({1:P3})",
                        totalMidpoint, totalMidpoint/totalCount)
      Console.WriteLine("Total number of values: {0,10:N0}", 
                        totalCount)                  
   End Sub
End Module
' 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

Megjegyzések

Ez a metódus a túlcsordulási feltételt a következő körbefuttatással kezeli: ha location = Int32.MaxValue, location + 1 = . Int32.MinValue Nincs kivétel.

Lásd még

A következőre érvényes:

Increment(Int64)

Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs
Forrás:
Interlocked.CoreCLR.cs

Egy megadott változót növekményesen tárol, és atomi műveletként tárolja az eredményt.

public:
 static long Increment(long % location);
public static long Increment(ref long location);
static member Increment : int64 -> int64
Public Shared Function Increment (ByRef location As Long) As Long

Paraméterek

location
Int64

Az a változó, amelynek értékét növelni kell.

Válaszok

A változó értéke közvetlenül a növekményes művelet befejezése után.

Kivételek

A cím location egy null mutató.

Megjegyzések

Ez a metódus a túlcsordulási feltételt a következő körbefuttatással kezeli: ha location = Int64.MaxValue, location + 1 = . Int64.MinValue Nincs kivétel.

Lásd még

A következőre érvényes: