Se stai utilizzando GCC sulla tua piattaforma CentOS, puoi utilizzare __atomic funzioni integrate.
Di particolare interesse potrebbe essere questa funzione:
— Funzione integrata:
bool __atomic_always_lock_free (size_t size, void *ptr)
Questa funzione integrata restituisce true se gli oggetti disizei byte generano sempre istruzioni atomiche senza blocco per l'architettura di destinazione.sizedeve risolversi in una costante in fase di compilazione e anche il risultato si risolve in una costante in fase di compilazione.
ptrè un puntatore facoltativo all'oggetto che può essere utilizzato per determinare l'allineamento. Un valore di0indica che dovrebbe essere utilizzato l'allineamento tipico. Il compilatore può anche ignorare questo parametro.if (_atomic_always_lock_free (sizeof (long long), 0))
Primitive atomiche C11
http://en.cppreference.com/w/c/language/atomic
_Atomic const int * p1; // p is a pointer to an atomic const int
const atomic_int * p2; // same
const _Atomic(int) * p3; // same
Aggiunto in glibc 2.28. Testato in Ubuntu 18.04 (glibc 2.27) compilando glibc dal sorgente:più librerie glibc su un singolo host Successivamente testato anche su Ubuntu 20.04, glibc 2.31.
Esempio adattato da: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)
{
(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);
}
Compila ed esegui:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c -pthread
./main.out
Possibile output:
The atomic counter is 10000
The non-atomic counter is 8644
È molto probabile che il contatore non atomico sia più piccolo di quello atomico a causa dell'accesso audace attraverso i thread alla variabile non atomica.
Analisi di disassemblaggio su:Come posso iniziare i thread in C semplice?