c / expert
Snippet
Sperrfreie Aufgaben-Synchronisation mittels C11 Atomic Flag Primitiven
Dieses Beispiel demonstriert sperrfreie Hardware-Synchronisation unter Nutzung von C11 stdatomic.h. Mittels atomic_flag_test_and_set_explicit und Acquire-Speicherordnung wird unterbrechungsfreie Exklusivität ohne Betriebssystem-Mutex-Overhead garantiert.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdatomic.h>#include <stdbool.h>typedef struct {atomic_flag flag;int payload;} ConcurrentBuffer;void buffer_init(ConcurrentBuffer *cb) {atomic_flag_clear(&cb->flag);cb->payload = 0;}bool try_acquire_and_write(ConcurrentBuffer *cb, int data) {if (!atomic_flag_test_and_set_explicit(&cb->flag, memory_order_acquire)) {cb->payload = data;atomic_flag_clear_explicit(&cb->flag, memory_order_release);return true;}return false;}
Erklärung
1
atomic_flag flag;
Deklariert ein garantiert sperrfreies atomares Flag als Zustandsspeicher.
2
atomic_flag_clear(&cb->flag);
Initialisiert das atomare Flag in den zurückgesetzten (entsperrten) Zustand.
3
if (!atomic_flag_test_and_set_explicit(&cb->flag, memory_order_acquire)) {
Setzt das Flag atomar unter Anweisung einer Acquire-Speicherbarriere zum Schutz des kritischen Abschnitts.
4
atomic_flag_clear_explicit(&cb->flag, memory_order_release);
Gibt die Sperre atomar mit Release-SpeichersSemantik frei, um Änderungen sichtbar zu machen.