Возвращаемое значение Interlocked.Exchange также обрабатывается атомарно? - PullRequest
0 голосов
/ 04 октября 2010

В следующем коде:

a = Interlocked.Exchange(ref b, c);

Я знаю, что b установлен в c атомно.Но также установлен ли b в той же самой атомарной операции?Или это вне атомарной операции.

Мне нужно убедиться, что и a, и b установлены в одной и той же атомарной операции.

c => b, b => a

Это в C # .Net.

Ответы [ 2 ]

2 голосов
/ 04 октября 2010

Полагаю, вы рассматриваете такой код:

using System;
using System.Threading;

class Test
{
    static int x = 1;
    static int y = 2;

    static void Main()
    {
        x = Interlocked.Exchange(ref y, 5);
    }
}

В этом случае нет, операция не является атомарной.В IL есть два отдельных действия:

  • Вызов метода
  • Копирование значения из условного стека в поле

Это будет полностьювозможно, что другой поток «увидит» y станет 5 до того, как возвращаемое значение Interlocked.Exchange будет сохранено в x.

Лично, если бы я искал что-то, где вам нужно несколько значений полейизмененный атомарно, я бы рассматривал блокировки вместо атомарных операций без блокировки.

0 голосов
/ 04 октября 2010

Определение метода Interlocked.Exchange (Int32, Int32):

Устанавливает 32-разрядное целое число со знаком в указанное значение и возвращает исходное значение в качестве атомарной операции.

Пример кода в статье MSDN http://msdn.microsoft.com/en-us/library/d3fxt78a.aspx использует код возврата Interlocked.Exchange для поточно-ориентированной блокировки ресурсов.Итак, ответ - да, это атомарная операция.

Конечно, если вы запустите Interlocked.Exchange в разных потоках и назначите возвращаемое значение одной и той же переменной, результат может быть неверным.Но это общие правила безопасности потоков - просто используйте локальную переменную.

...