атомарные операции в riscv. __atomic_test_and_set, __atomic_clear,
__atomic_fetch_add, __atomic_fetch_sub и тд. понимаю что они делают
но не понимаю как применить и где, тыкните в книжицу по теме. при ковырянии исходников кодогенератора gcc в части порта riscv нашел генерацию встроенных расширений - ну ессесено в связи с тем что gd32vf1 имет проц IMAC, буква А как бы намекает что немедленно захотелось посмотреть че де как работает и "что мы можем иметь с Гусева"
int val = 0 ;
nop();
__atomic_test_and_set(&val, __ATOMIC_SEQ_CST);
nop();
__atomic_clear(&val, __ATOMIC_SEQ_CST);
nop();
__atomic_fetch_add (&val, 10, __ATOMIC_SEQ_CST);
nop();
__atomic_fetch_sub (&val, -20, __ATOMIC_SEQ_CST);
nop();
выход кодогенратора
08000956: nop
110 __atomic_test_and_set(&val, __ATOMIC_SEQ_CST);
08000958: lui a5,0x20000
0800095c: addi t0,a5,1384 # 0x20000568
по ходу список такой:
exchange
compare
set
clear
add
sub
or
xor
and
все с немрнятными пока мне параметр memory_order
__ATOMIC_RELAXED
__ATOMIC_CONSUME
__ATOMIC_ACQUIRE
__ATOMIC_RELEASE
__ATOMIC_ACQ_REL
__ATOMIC_SEQ_CST
я исхожу из той мысли что раз уж есть иструкции проца да еще и компиллер умеет их юзать - не использовать по назначению значит творить говнокод.
че с этим добром делают умные люди и где применяют .