c / expert
Snippet
Sperrfreier Zustandsübergang mittels atomarem Compare-Exchange in C11
In hochperformanten nebenläufigen C-Systemen erzeugen Mutexe Thread-Blockierungs-Overhead. C11 Atomic-Primitiven wie atomic_compare_exchange_strong ermöglichen sperrfreie Zustandsaktualisierungen, indem sie den Speicherinhalt mit einem erwarteten Wert vergleichen und atomar aktualisieren.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdatomic.h>#include <stdbool.h>#include <stdio.h>typedef enum { STATE_IDLE, STATE_BUSY, STATE_DONE } MachineState;bool try_transition(_Atomic MachineState *state, MachineState expected, MachineState next) {return atomic_compare_exchange_strong(state, &expected, next);}int main(void) {_Atomic MachineState current = STATE_IDLE;if (try_transition(¤t, STATE_IDLE, STATE_BUSY)) {printf("State successfully transitioned to BUSY.\n");}return 0;}
Erklärung
1
_Atomic MachineState *state
Qualifiziert die Zustandsvariable als atomaren Typ, um Data Races bei nebenläufigen Lese- und Schreibzugriffen zu verhindern.
2
atomic_compare_exchange_strong(state, &expected, next)
Aktualisiert *state atomar auf next, wenn es gleich *expected ist; andernfalls wird *expected auf den aktuellen Wert von *state gesetzt.