C# Language
Обеспечение безопасности переменной потока
Поиск…
Управление доступом к переменной в цикле Parallel.For
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main( string[] args )
{
object sync = new object();
int sum = 0;
Parallel.For( 1, 1000, ( i ) => {
lock( sync ) sum = sum + i; // lock is necessary
// As a practical matter, ensure this `parallel for` executes
// on multiple threads by simulating a lengthy operation.
Thread.Sleep( 1 );
} );
Console.WriteLine( "Correct answer should be 499500. sum is: {0}", sum );
}
}
Недостаточно просто делать sum = sum + i
без блокировки, потому что операция чтения-изменения-записи не является атомарной. Нить будет перезаписывать любые внешние изменения в sum
которая возникает после того, как она прочитает текущее значение sum
, но до того, как она сохранит измененное значение sum + i
обратно в sum
.
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow