Interlocked.Decrement Metode
Definisi
Penting
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Mengurangi variabel tertentu dan menyimpan hasilnya, sebagai operasi atomik.
Overload
Decrement(Int64) |
Mengurangi variabel yang ditentukan dan menyimpan hasilnya, sebagai operasi atomik. |
Decrement(Int32) |
Mengurangi variabel tertentu dan menyimpan hasilnya, sebagai operasi atomik. |
Decrement(UInt32) |
Mengurangi variabel tertentu dan menyimpan hasilnya, sebagai operasi atomik. |
Decrement(UInt64) |
Mengurangi variabel tertentu dan menyimpan hasilnya, sebagai operasi atomik. |
Decrement(Int64)
- Sumber:
- Interlocked.CoreCLR.cs
- Sumber:
- Interlocked.CoreCLR.cs
- Sumber:
- Interlocked.CoreCLR.cs
Mengurangi variabel yang ditentukan dan menyimpan hasilnya, sebagai operasi atomik.
public:
static long Decrement(long % location);
public static long Decrement (ref long location);
static member Decrement : int64 -> int64
Public Shared Function Decrement (ByRef location As Long) As Long
Parameter
- location
- Int64
Variabel yang nilainya akan dikurangi.
Mengembalikan
Nilai variabel segera setelah operasi penurunan selesai.
Pengecualian
Alamat location
adalah null
penunjuk.
Alamat location
adalah null
penunjuk.
Keterangan
Metode ini menangani kondisi luapan dengan membungkus: jika location
= Int64.MinValue, location
- 1 = . Int64.MaxValue Tidak terkecuali yang dilemparkan.
Lihat juga
Berlaku untuk
Decrement(Int32)
- Sumber:
- Interlocked.CoreCLR.cs
- Sumber:
- Interlocked.CoreCLR.cs
- Sumber:
- Interlocked.CoreCLR.cs
Mengurangi variabel tertentu dan menyimpan hasilnya, sebagai operasi atomik.
public:
static int Decrement(int % location);
public static int Decrement (ref int location);
static member Decrement : int -> int
Public Shared Function Decrement (ByRef location As Integer) As Integer
Parameter
- location
- Int32
Variabel yang nilainya akan dikurangi.
Mengembalikan
Nilai variabel segera setelah operasi penurunan selesai.
Pengecualian
Alamat location
adalah null
penunjuk.
Alamat location
adalah null
penunjuk.
Contoh
Contoh berikut menentukan berapa banyak angka acak yang berkisar dari 0 hingga 1.000 yang diperlukan untuk menghasilkan 1.000 angka acak dengan nilai titik tengah. Untuk melacak jumlah nilai titik tengah, variabel, midpointCount
, diatur sama dengan 1.000 dan dikurangi setiap kali generator angka acak mengembalikan nilai titik tengah. Karena tiga utas menghasilkan angka acak, Decrement(Int32) metode dipanggil untuk memastikan bahwa beberapa utas tidak diperbarui midpointCount
secara bersamaan. Perhatikan bahwa kunci juga digunakan untuk melindungi generator angka acak, dan bahwa CountdownEvent objek digunakan untuk memastikan bahwa Main
metode tidak menyelesaikan eksekusi sebelum tiga utas.
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
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 = 10000
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.Decrement(midpointCount)
midpt += 1
End If
total += 1
Loop While midpointCount > 0
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: 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
Contoh berikut mirip dengan yang sebelumnya, kecuali menggunakan kelas alih-alih prosedur utas Task untuk menghasilkan 50.000 bilangan bulat titik tengah acak. Dalam contoh ini, ekspresi lambda menggantikan prosedur utas GenerateNumbers
, dan panggilan ke Task.WaitAll metode menghilangkan kebutuhan akan CountdownEvent objek.
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
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 = 50000
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.Decrement(midpointCount)
midpt += 1
End If
total += 1
Loop While midpointCount > 0
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 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
Keterangan
Metode ini menangani kondisi luapan dengan membungkus: Jika location
= Int32.MinValue, location
- 1 = . Int32.MaxValue Tidak terkecuali yang dilemparkan.
Lihat juga
Berlaku untuk
Decrement(UInt32)
- Sumber:
- Interlocked.cs
- Sumber:
- Interlocked.cs
- Sumber:
- Interlocked.cs
Penting
API ini bukan kompatibel CLS.
Mengurangi variabel tertentu dan menyimpan hasilnya, sebagai operasi atomik.
public:
static System::UInt32 Decrement(System::UInt32 % location);
[System.CLSCompliant(false)]
public static uint Decrement (ref uint location);
[<System.CLSCompliant(false)>]
static member Decrement : uint32 -> uint32
Public Shared Function Decrement (ByRef location As UInteger) As UInteger
Parameter
- location
- UInt32
Variabel yang nilainya akan dikurangi.
Mengembalikan
Nilai variabel segera setelah operasi penurunan selesai.
- Atribut
Pengecualian
Alamat location
adalah null
penunjuk.
Berlaku untuk
Decrement(UInt64)
- Sumber:
- Interlocked.cs
- Sumber:
- Interlocked.cs
- Sumber:
- Interlocked.cs
Penting
API ini bukan kompatibel CLS.
Mengurangi variabel tertentu dan menyimpan hasilnya, sebagai operasi atomik.
public:
static System::UInt64 Decrement(System::UInt64 % location);
[System.CLSCompliant(false)]
public static ulong Decrement (ref ulong location);
[<System.CLSCompliant(false)>]
static member Decrement : uint64 -> uint64
Public Shared Function Decrement (ByRef location As ULong) As ULong
Parameter
- location
- UInt64
Variabel yang nilainya akan dikurangi.
Mengembalikan
Nilai variabel segera setelah operasi penurunan selesai.
- Atribut
Pengecualian
Alamat location
adalah null
penunjuk.