Будет ли состояние гонок, если один поток меняет переменную типа bool, а другой читает из неё?

Oct 26, 2012 16:24

Существует 2 потока, один из которых читает данные из переменной типа bool, а другой может менять её значение.

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

(Ответ)

Leave a comment

Comments 2

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

Reply


aso March 24 2013, 12:58:26 UTC
В общем случае нужно volatile специфицировать - иначе скорее будет неконсистентность, нежели чем неатомарность.
Ну и плюс - логические операции для Си определены так, что неатомарность непросто получить.

Reply


Leave a comment

Up