C11 атомный минимальный пример выполнения
С добавлением потоков в glibc 2.28 мы можем выполнять как атомарность, так и создание потоков в чистом C11.
Пример из: https://en.cppreference.com/w/c/language/atomic
main.c
#include <stdio.h>
#include <threads.h>
#include <stdatomic.h>
atomic_int acnt;
int cnt;
int f(void* thr_data)
{
for(int n = 0; n < 1000; ++n) {
++cnt;
++acnt;
// for this example, relaxed memory order is sufficient, e.g.
// atomic_fetch_add_explicit(&acnt, 1, memory_order_relaxed);
}
return 0;
}
int main(void)
{
thrd_t thr[10];
for(int n = 0; n < 10; ++n)
thrd_create(&thr[n], f, NULL);
for(int n = 0; n < 10; ++n)
thrd_join(thr[n], NULL);
printf("The atomic counter is %u\n", acnt);
printf("The non-atomic counter is %u\n", cnt);
}
Скомпилируйте и запустите:
gcc -std=c11 main.c -pthread
./a.out
Возможный вывод:
The atomic counter is 10000
The non-atomic counter is 8644
Скорее всего, неатомарный счетчик будет меньше атомного из-за быстрого доступа через потоки к неатомарной переменной.
Пример pthreads можно найти по адресу: Как запустить потоки в простом C?
Протестировано в Ubuntu 18.04 (glibc 2.27) путем компиляции glibc из исходного кода: Несколько библиотек glibc на одном хосте В Ubuntu 18.10 есть glibc 2.28, поэтому все должно работать там.