Dalam hal ini, saya mendefinisikan bacaan kotor sebagai membaca dari memori ketika sedang ditulis oleh thread lain.
Jadi jika thread #1 menulis 100 ke variabel yang juga dapat dilihat oleh thread #2, maka thread #2 akan menulis 50 ke variabel yang sama, di mana kedua thread melakukannya dalam satu lingkaran.
Apakah mungkin membaca variabel dan mendapatkan angka bukan 50 atau 100? Tidak menggunakan kunci dll untuk sinkronisasi.
Lebih detail tentang pengaturan saya: CPU Intel i3, saya memprogram dalam C#.
Di bawah ini adalah contoh yang saya maksud:
using System;
using System.Collections.Generic;
using System.Threading;
namespace Threading001
{
class Program
{
static void Main(string[] args)
{
long min = long.MinValue;
long max = long.MaxValue;
object number = max;
new Thread(() =>
{
long current2 = (long)number;
if (current2 != min && current2 != max)
{
Console.WriteLine("Unexpected number from thread 2: {0}.", current2);
}
number = min;
}).Start();
while (true)
{
long current = (long)number;
if (current != min && current != max)
{
Console.WriteLine("Unexpected number from thread 1: {0}.", current);
}
number = max;
}
}
}
}
Saya menjadikan number sebagai objek sehingga memori dialokasikan di heap dan bukan di stack untuk mencoba dan meningkatkan waktu latensi akses memori. Meskipun caching cpu mungkin akan menghentikannya.