Воспроизвести разорванные чтения десятичного числа в C #
Видеть значит верить. Может кто-нибудь воспроизвести программу, которая читает порванный десятичный? Я попытался раскрутить несколько потоков, меняя одно и то же десятичное число от 1 до 2. Я не перехватывал ни одного чтения, отличного от 1 или 2.
РЕДАКТИРОВАТЬ: Мне нравится видеть, что поток чтения не видит атомного изменения из потока записи, поэтому значение должно быть чем-то отличным от 1 или 2.
void TornDecimalReadTest()
{
decimal sharedDecimal = 1;
int threadCount = 100;
var threads = new List<Thread>();
for (int i = 0; i < threadCount; i++)
{
int threadId = i;
var thread = new Thread(() =>
{
Thread.Sleep(5000);
decimal newValue = threadId % 2 == 0 ? 1 : 2;
bool isWriterThread = threadId % 2 == 0;
Console.WriteLine("Writer : " + isWriterThread + " - will set value " + newValue);
for (int j = 0; j < 1000000; j++)
{
if (isWriterThread)
sharedDecimal = newValue;
decimal decimalRead = sharedDecimal;
if (decimalRead != 1 && decimalRead != 2)
Console.WriteLine(decimalRead);
}
});
threads.Add(thread);
}
threads.ForEach(x => x.Start());
threads.ForEach(x => x.Join());
}