Хотя переменные индивидуально атомарны, ваш цикл сравнения - нет.Возможно, нелогично, чтение атомарной переменной может генерировать больше инструкций, чем чтение неатомарной.
Рассмотрим, например, если вы написали код с таким же поведением, используя атомарные встроенные функции GCC:
while(1)
{
unsigned long _tmp1 = __atomic_load_n(&overwrap_read_cnt, __ATOMIC_RELAXED);
unsigned long _tmp2 = __atomic_load_n(&overwrap_cnt, __ATOMIC_RELAXED);
if (_tmp1 == _tmp2)
{
_tmp2 = __atomic_load_n(&overwrap_cnt, __ATOMIC_RELAXED);
_tmp1 = __atomic_load_n(&overwrap_read_cnt, __ATOMIC_RELAXED);
printf("or:%lu, ow:%lu \n", _tmp1, _tmp2);
}
usleep(100000);
}
Хотя значения, выбранные для сравнения, были определены как равные, они могут больше не совпадать с моментом их повторного вызова для вызова printf.
Если вы хотите убедиться, что значения, использованные позже, будутКак и в операторе if, вы должны получить их только один раз, а затем использовать кэшированные значения на протяжении всей итерации цикла.