В этом случае я определяю грязное чтение как чтение из памяти, когда оно в настоящее время записывается другим потоком.
Итак, если поток №1 записывает 100 в переменную, которую также может видеть поток №2, он записывает 50 в одну и ту же переменную, причем оба потока делают это в цикле.
Можно ли прочитать переменную и получить число, не равное ни 50, ни 100? Использование блокировки и т. Д. Для синхронизации.
Подробнее о моей настройке: Intel i3 CPU, я программирую на C #.
Вот пример того, что я имею в виду:
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;
}
}
}
}
Я сделал число объектом, чтобы память выделялась в куче, а не в стеке, чтобы попытаться увеличить время задержки доступа к памяти. Кеширование процессора, вероятно, все равно остановит это.