gcc встроенный атомарный сравнение и обмен

Я хочу использовать встроенную функцию gcc __atomic_compare_exchange(), но мне нужно, чтобы она немного отличалась от указанной, и я не уверен, что это возможно.

прототип функции:

__atomic_compare_exchange(type *ptr, type *expected, type *desired, bool weak, int success_memmodel, int failure_memmodel)

он атомарно сравнивает ptr с expected и записывает desired в ptr, если ptr == expected

то, чего я хочу добиться, очень похоже, но мой expected равен != NULL, в основном я хочу проверить, является ли ptr != NULL и, если это правда, записать desired в ptr.

это можно сделать?

вот gcc относительно его использования:

https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html


person rowan.G    schedule 07.12.2014    source источник


Ответы (1)


Конечно, но вам просто нужно вызвать его в цикле. На каждой итерации цикла считывайте старое значение. Если он равен нулю, выйти из цикла и вернуть ошибку. Если оно не равно нулю, используйте это старое значение как «ожидаемое» для атомарного сравнения и обмена. Если это удается, выходим из цикла и возвращаем успех. В противном случае повторить.

Между прочим, этот общий подход заключается в том, как вы строите произвольные атомарные операции поверх сравнения-и-обмена.

person R.. GitHub STOP HELPING ICE    schedule 07.12.2014
comment
но тогда я теряю атомарность, для меня важно, чтобы и сравнение чтения, и запись вместе были атомарными. Если это не так, возникает состояние гонки, когда данные могут меняться между чтением, сравнением и записью. - person rowan.G; 07.12.2014
comment
Нет, вы не теряете атомарность. В этом весь смысл. Атомарное сравнение и замена дает вам любую атомарную операцию, которую вы хотите, с помощью этого метода. Если данные изменяются между чтением старого значения (чтобы получить ожидаемое) и атомарным cas, cas дает сбой, и вы начинаете сначала. - person R.. GitHub STOP HELPING ICE; 07.12.2014