В основном то, что я ищу, - это что-то, что выполнит sh следующий лог c атомарно.
#define FAILED 1
#define SUCCESS 0
int foo (uint64_t * src, uint64_t * dst, uint64_t expected) {
if (*src == expected) {
*dst = *src;
return SUCCESS;
}
return FAILURE;
}
Для этого конкретного варианта использования expected == 0
во всех случаях и *dst
НЕ МОЖЕТ может быть изменен любым другим потоком. *src
, однако может быть изменен другими потоками одновременно (эти другие потоки МОГУТ быть на других ядрах, иначе я мог бы использовать перезапускаемые последовательности)
Чтобы это было правильно *dst
НЕЛЬЗЯ изменить, если *src != expected
( с expected == 0
).
У меня есть инвариант *src != *dst
, кроме случая *src == *dst == 0
(это может быть полезно для поиска решения).
Наконец, если он позволяет какие-либо потенциальные решения, я могу Гарантирую, что *src
и *dst
находятся либо в одной строке кэша, либо в разных строках кеша.
Я не верю ни одной из встроенных операций atomi c (https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html) может достичь этого, поэтому я думаю, что единственный способ сделать это будет с некоторой встроенной сборкой с префиксом lock
или с использованием некоторого побочного эффекта какой-либо функции (то есть чего-то вроде того факта, что CAS установит ожидаемый на Ошибка).
В итоге я ищу либо способ реализовать настраиваемую операцию atomi c с встроенным asm, либо каким-то образом я могу использовать для этого bultin atomics.
Спасибо!