LINUX.ORG.RU

История изменений

Исправление Aber, (текущая версия) :

Не знаю UB ли это но тут без volatile нет детерминированного поведения, тело может выполниться лишний раз непосредственно после установки флага из другого треда, потому что для выполнения ассемблерного cmp значение переменной нужно выгрузить из памяти в регистр процессора, в этом случае даже стопроцентно согласованные кэши не помогут.

Update: volatile тоже не поможет, разве только как тут привели выше while(!(volatile int)flag), но надо посмотреть как это выглядит на уровне ассемблера. Я не сишник и не системный программист, но я бы использовал lock/mutex/критическую секцию.

Исправление Aber, :

Не знаю UB ли это но тут без volatile нет детерминированного поведения, тело может выполниться лишний раз непосредственно после установки флага из другого треда, потому что для выполнения ассемблерного cmp значение переменной нужно выгрузить из памяти в регистр процессора, в этом случае даже стопроцентно согласованные кэши не помогут.

Update: volatile тоже не поможет, разве только как тут привели выше while(!(volatile int)flag), но надо посмотреть как это выглядит на уровне ассемблера. Я не сишник и не системный программист, но я бы использовал атомик.

Исходная версия Aber, :

Не знаю UB ли это но тут без volatile нет детерминированного поведения, тело может выполниться лишний раз непосредственно после установки флага из другого треда, потому что для выполнения ассемблерного cmp значение переменной нужно выгрузить из памяти в регистр процессора, в этом случае даже стопроцентно согласованные кэши не помогут.