Apa cara untuk mendapatkan penghitung aman thread di C # dengan kinerja terbaik?
Ini sesederhana yang didapat:
public static long GetNextValue()
{
long result;
lock (LOCK)
{
result = COUNTER++;
}
return result;
}
Tetapi apakah ada alternatif yang lebih cepat?
sumber
Saya sarankan Anda menggunakan kenaikan interlock built in NET di perpustakaan System.Threading.
Kode berikut akan menambah variabel panjang dengan referensi dan sepenuhnya aman untuk thread:
Sumber: http://msdn.microsoft.com/en-us/library/dd78zt0c.aspx
sumber
Coba dengan Interlocked.Increment
sumber
Seperti yang sudah disebutkan digunakan
Interlocked.Increment
Contoh kode dari MS:
Contoh berikut menentukan berapa banyak angka acak yang berkisar dari 0 hingga 1.000 diperlukan untuk menghasilkan 1.000 angka acak dengan nilai titik tengah. Untuk melacak jumlah nilai titik tengah, variabel, midpointCount, disetel sama dengan 0 dan bertambah setiap kali generator angka acak mengembalikan nilai titik tengah hingga mencapai 10.000. Karena tiga utas menghasilkan angka acak, metode Penambahan (Int32) dipanggil untuk memastikan bahwa beberapa utas tidak memperbarui midpointCount secara bersamaan. Perhatikan bahwa kunci juga digunakan untuk melindungi generator angka acak, dan bahwa objek CountdownEvent digunakan untuk memastikan bahwa metode Utama tidak menyelesaikan eksekusi sebelum tiga utas.
Contoh berikut ini mirip dengan yang sebelumnya, kecuali bahwa ia menggunakan kelas Tugas alih-alih prosedur utas untuk menghasilkan 50.000 bilangan bulat titik tengah acak. Dalam contoh ini, ekspresi lambda menggantikan prosedur thread GenerateNumbers, dan panggilan ke metode Task.WaitAll menghilangkan kebutuhan untuk objek CountdownEvent.
https://docs.microsoft.com/en-us/dotnet/api/system.threading.interlocked.increment?view=netcore-3.0
sumber