в общем случае : Если код нэйтив( не жава-или шарп ), и переменная выделена с правильным выравниванием/размером - будет атомарной; Лучше ее определить не как булевскую, а как int - инт выделяется в правильном размере. Кроме того, она должна быть отдельной переменной или полем в структуре с дефолтной упаковкой и выравниванием. Если она попадает между двух кэш линий - уже не атомарная. Если меняет только один процесс - в принципе можно просто читать переменную в цикле, пока значения меняются с небольшим делэем; Тогда, если два раза прочитано одинаковое значение - оно правильно; В случае булевской переменной - Для типа со значением 0/1 вероятность прочитать неправильно вообще нулевая - меняется только один байт! Смешаных результатов быть не может вообще.
В общем случае нужно volatile специфицировать - иначе скорее будет неконсистентность, нежели чем неатомарность. Ну и плюс - логические операции для Си определены так, что неатомарность непросто получить.
Comments 2
Если меняет только один процесс - в принципе можно просто читать переменную в цикле, пока значения меняются с небольшим делэем; Тогда, если два раза прочитано одинаковое значение - оно правильно;
В случае булевской переменной - Для типа со значением 0/1 вероятность прочитать неправильно вообще нулевая - меняется только один байт! Смешаных результатов быть не может вообще.
Reply
Ну и плюс - логические операции для Си определены так, что неатомарность непросто получить.
Reply
Leave a comment