Interlocked.Increment Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace.
Přetížení
Increment(UInt64) |
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace. |
Increment(UInt32) |
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace. |
Increment(Int32) |
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace. |
Increment(Int64) |
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace. |
Increment(UInt64)
- Zdroj:
- Interlocked.cs
- Zdroj:
- Interlocked.cs
- Zdroj:
- Interlocked.cs
Důležité
Toto rozhraní API neodpovídá specifikaci CLS.
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace.
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
Parametry
- location
- UInt64
Proměnná, jejíž hodnota se má zvýšit.
Návraty
Hodnota proměnné bezprostředně po dokončení operace inkrementace
- Atributy
Výjimky
Adresa location
je null
ukazatel.
Platí pro
Increment(UInt32)
- Zdroj:
- Interlocked.cs
- Zdroj:
- Interlocked.cs
- Zdroj:
- Interlocked.cs
Důležité
Toto rozhraní API neodpovídá specifikaci CLS.
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace.
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
Parametry
- location
- UInt32
Proměnná, jejíž hodnota se má zvýšit.
Návraty
Hodnota proměnné bezprostředně po dokončení operace inkrementace
- Atributy
Výjimky
Adresa location
je null
ukazatel.
Platí pro
Increment(Int32)
- Zdroj:
- Interlocked.CoreCLR.cs
- Zdroj:
- Interlocked.CoreCLR.cs
- Zdroj:
- Interlocked.CoreCLR.cs
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace.
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
Parametry
- location
- Int32
Proměnná, jejíž hodnota se má zvýšit.
Návraty
Hodnota proměnné bezprostředně po dokončení operace inkrementace
Výjimky
Adresa location
je null
ukazatel.
Příklady
Následující příklad určuje, kolik náhodných čísel v rozsahu od 0 do 1 000 je potřeba k vygenerování 1 000 náhodných čísel se střední hodnotou. Aby bylo možné sledovat počet hodnot středových bodů, proměnná se nastaví na hodnotu 0 a zvýší se pokaždé, midpointCount
když generátor náhodných čísel vrátí hodnotu středového bodu, dokud nedosáhne 10 000. Vzhledem k tomu, že tři vlákna generují náhodná čísla, Increment(Int32) volá se metoda, aby se zajistilo, že se současně neaktualizuje midpointCount
více vláken. Všimněte si, že zámek slouží také k ochraně generátoru náhodných čísel a že CountdownEvent objekt se používá k zajištění, že Main
metoda nedokončí provádění před třemi vlákny.
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
Následující příklad je podobný předchozímu, s tím rozdílem, že používá Task třídu místo procedury vlákna k vygenerování 50 000 náhodných celých čísel střední bod. V tomto příkladu nahradí proceduru GenerateNumbers
vlákna výraz lambda a volání Task.WaitAll metody eliminuje potřebu objektu CountdownEvent .
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
Poznámky
Tato metoda zpracovává podmínku přetečením zabalením: if location
= Int32.MaxValue, location
+ 1 = Int32.MinValue. Žádná výjimka se nevyvolá.
Viz také
Platí pro
Increment(Int64)
- Zdroj:
- Interlocked.CoreCLR.cs
- Zdroj:
- Interlocked.CoreCLR.cs
- Zdroj:
- Interlocked.CoreCLR.cs
Zvýší zadanou proměnnou a uloží výsledek jako atomická operace.
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
Parametry
- location
- Int64
Proměnná, jejíž hodnota se má zvýšit.
Návraty
Hodnota proměnné bezprostředně po dokončení operace inkrementace
Výjimky
Adresa location
je null
ukazatel.
Poznámky
Tato metoda zpracovává podmínku přetečením zabalením: if location
= Int64.MaxValue, location
+ 1 = Int64.MinValue. Žádná výjimka se nevyvolá.