У меня есть фиктивный вопрос об атомарных переменных, использующих gcc.
Моя машина поддерживает функцию __sync_add_and_fetch
; Я использую этот вызов в потоке A, чтобы установить my_variable (int)
.
Я хочу, чтобы поток B считывал эту общую переменную, чтобы проверить ее по значению, например, 20.
Правильно ли написать следующее
if( __sync_bool_compare_and_swap( &my_variable, 20, 20 ) ){
//..Ok! It is 20 so go ahead!
}else{
// wrong: it is not ok.
}
Если я не ошибаюсь в gcc, __sync_val_compare_and_swap
может завершиться ошибкой, если в разделяемой переменной есть гонка, но я не знаю, что она возвращает; как это работает с __sync_bool_compare_and_swap
?
Проблема в том, что происходит, когда одновременно поток А изменяет значение с помощью __sync_fetch_and_add
? Всегда ли гарантируется, что он вернет значение этого события суммы, когда __sync_bool_compare_and_swap
запущен одновременно?
В идеале и для моих целей мне действительно нужна была бы функция, выполняющая только атомарный READ, или обмен. Имеет ли C или gcc что-то подобное?
Большое спасибо
AFG