Программирование на "С/C++" и не только

Previous Entry Share Next Entry
Будет ли состояние гонок, если один поток меняет переменную типа bool, а другой читает из неё?
wildfrog wrote in ru_cpp
Существует 2 потока, один из которых читает данные из переменной типа bool, а другой может менять её значение.

Являются ли эти две операции атомарными по отношению друг к другу?
А если нет, то как сделать монопольный доступ к этой переменной?

(Ответ)

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

В общем случае нужно volatile специфицировать - иначе скорее будет неконсистентность, нежели чем неатомарность.
Ну и плюс - логические операции для Си определены так, что неатомарность непросто получить.

  • 1
?

Log in