Изменчивая переменная и многоядерная синхронизация потоков! - PullRequest
4 голосов
/ 24 мая 2011

У меня есть несколько потоков, выполняющихся одновременно и проверяющих значение поля в своем собственном объекте. Поле устанавливается потоком запуска следующим образом:

for (i = 0; i < ThreadCount; i++)
{
    ThreadContext[i].MyField = 1;
}

В каждом потоке я проверяю значение этого значения:

if (MyField == 1)
{
   ...//do something
}

Однако я заметил, что на 4-ядерном процессоре некоторым из (4) работающих потоков требуется несколько миллисекунд или даже больше, чтобы увидеть измененный MyField. MyField - это одно символьное поле. Кажется, что происходит то, что, когда шина памяти исчерпана первым потоком, который обнаруживает изменение, все другие потоки могут останавливаться почти на весь период выполнения первого. (при условии, что памяти достаточно). Только когда первый поток уменьшается в памяти (и делает больше с регистрами), это происходит тогда, когда другие потоки также могут увидеть новое значение.

Я проверил asm, и здесь нет оптимизации компилятора. Звонки идут прямо в память. Как это можно исправить?

Спасибо! Jam

1 Ответ

1 голос
/ 25 мая 2011

Я получил отзыв от Intel: Да, вот как это работает (не легко исправить).

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