ІМ’Я
rtapi_atomic — підмножина C11 stdatomic.h
СИНТАКСИС
#include <rtapi_atomic.h>
enum memory_order { ... };
#define atomic_store(obj, desired)...
#define atomic_store_explicit(obj, desired, order)...
#define atomic_load(obj)...
#define atomic_load_explicit(obj, order)...
АРГУМЕНТИ
- volatile A* obj
-
Покажчик на мінливий об’єкт, який є місцем призначення збереження або джерелом завантаження. Покажчик повинен мати відповідний тип і вирівнювання, щоб сама операція збереження або завантаження була атомарною; як мінімум, правильно вирівняний «int» може вважатися таким типом. Неправильний розмір або вирівнювання є недіагностованими помилками.
- C desired
-
Значення, яке зберігатиметься в об’єкті. "*obj = desired" має бути правильно сформованим.
- memory_order order
-
Необхідна семантика впорядкування пам’яті.
ОПИС
Цей заголовок надає принаймні підмножину C11 <+stdatomic.h>+, наведену вище. Коли існує вимога щодо порядку читання або запису декількох значень в областях спільної пам’яті RTAPI іншими потоками виконання, включаючи значення виводів HAL і параметрів, ці функції (або макроси, подібні до функцій) є єдиним способом забезпечити дотримання вимоги щодо порядку. В іншому випадку, відповідно до правил, специфічних для архітектури, завантаження та збереження можуть бути переупорядковані порівняно з їхнім звичайним порядком у вихідному коді.
Наприклад, щоб залишити повідомлення в області спільної пам’яті з одного потоку і отримати його з іншого, автор повинен використовувати атомарне збереження для змінної «повідомлення завершено», а читач повинен використовувати атомарне завантаження при перевірці цієї змінної:
// producer
*message = 42;
atomic_store_explicit(message_ready, 1, memory_order_release);
// споживач
while(atomic_load_explicit(message_ready, memory_order_acquire) == 0) sched_yield();
printf("message was %d\n", *message); // must print 42
МІРКУВАННЯ В РЕАЛЬНОМУ ЧАСІ
Може бути викликаний з будь-якого коду.
ПОВЕРНЕНЕ ЗНАЧЕННЯ
atomic_load and atomic_load_explicit return the value pointed to by the obj argument.
atomic_store and atomic_store_explicit have no return value.
ДИВІТЬСЯ ТАКОЖ
<stdatomic.h> (C11), <rtapi_bitops.h> (для інших атомарних операцій з пам’яттю, що підтримуються rtapi)