Рассмотрим этот кусок кода, который создает вокруг закрытия counter
:Нужно ли использовать блокировку при закрытии?
uint counter = 0xFFFF;
someList.AsParallel().ForEach(a => { uint tmp = ++counter });
(Пожалуйста, отведенных на мгновение очевидную проблему с помощью счетчика внутри параллельной Еогеасп).
Будет ли tmp
оцениваться до 0x0000 или 0x1FFFF?
Мое рассуждение: для увеличения counter
от 0xFFFF до 0x10000 требуется, по крайней мере, двухбайтовая команда ЦП, которая может быть прервана многопотоковой обработкой. Если это прерывается, есть вероятность, что будет обновлен только один байт counter
- его можно временно установить на 0x00000 или 0x1FFFF.
Если я написал это так:
uint counter = 0xFFFF;
someList.AsParallel().ForEach(a => { uint tmp = Interlocked.Increment(counter) });
...?
И если я избавлюсь от AsParallel
, я полностью в безопасности?