LinuxCNC Documentation

ІМ’Я

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)