Может ли конфликт чтения-записи вызвать бесконечный цикл? - PullRequest
0 голосов
/ 14 января 2010

Скажем, есть оператор, ожидающий обновления переменной другим потоком.

#in thread1:
while (flag == 0);

Без использования каких-либо блокировок может возникнуть конфликт чтения-записи, если один поток читает переменную, пока она обновляется другим.

#in thread2:
flag = 1;

Может ли это привести к бесконечному циклу? или конфликт только задержит поток # 1?

Заранее спасибо,

Ответы [ 3 ]

2 голосов
/ 14 января 2010

Если flag не помечен как энергозависимый, он может не обновляться, поскольку код цикла while может ссылаться на значение, кэшированное в регистре.

0 голосов
/ 14 января 2010

Как показано там, если больше ничего не происходит, пока строка в потоке 2 каждый попадает в исполнение, то thread1 не будет в бесконечном цикле, который вы описали выше. В большинстве случаев, поскольку потоки фактически не выполняются одновременно, обе строки не могут выполняться одновременно, если вы не работаете на нескольких ядрах ЦП.

Обратите внимание, что я должен был быть очень осторожным с моей формулировкой, потому что есть много других вещей, которые могут пойти не так.

0 голосов
/ 14 января 2010

(при условии c / c ++): если (flag) не объявлен как volatile, thread1 может считывать значение флага из регистра, поэтому он может никогда не увидеть, что thread2 изменил расположение памяти в флаге на 1, и, таким образом, thread1 может продолжить зацикливание навсегда, хотя thread2 устанавливает флаг в 1.

Другая возможность может заключаться в том, что thread1 работает с более высоким приоритетом, чем thread2, поэтому thread2 никогда не получает возможности запустить и установить flag = 1, потому что thread1 навсегда запустит процессор в себя.

...