Как определить переставляемый код? Проблемы с переупорядочением кода (.NET) - PullRequest
1 голос
/ 15 января 2009

В этой статье MSDN указано, что:

процессоры могут переупорядочивать этот код

internal static volatile int s_x = 0;
internal static volatile int s_y = 0;
internal static volatile int s_ya = 0;

void ThreadA() {
    s_x = 1;
    s_ya = s_y;
}

Меня беспокоит возможность переупорядочения какого-либо кода, и я знаю, как определить переупорядочиваемый код Специально об этом куске моего кода:

Processing.Add(ItemNumber, null);
AsyncTask.Begin(InternalRequestCallback, Remove, ItemNumber);

Это должно произойти в указанном порядке, иначе произойдет сбой. Должен ли я поставить Thread.MemoryBarrier (); между этими утверждениями?

1 Ответ

3 голосов
/ 15 января 2009

Короткая версия: нет.

Ваш код просто выполняет два вызова; среда выполнения гарантирует, что эти методы будут выполняться (по крайней мере, в одном потоке) последовательно.

Сложность статьи была связана со сложностями потоков 2 , обращающихся к общему состоянию (для примера нужен метод ThreadB, чтобы иметь смысл). Код, который вы вставили, я уверен, не подлежит переупорядочению - не в последнюю очередь потому, что это последовательные инструкции (для зависимых данных) в одном потоке.

Тебе нужно углубиться в подробности, чем я понимаю. Но если вы не делаете что-то сложное с многопоточным программированием без блокировки, это вряд ли вас укусит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...