Jika Anda menggunakan GCC pada platform CentOS Anda, maka Anda dapat menggunakan __atomic
fungsi bawaan.
Yang menarik mungkin fungsi ini:
— Fungsi Bawaan:
bool __atomic_always_lock_free (size_t size, void *ptr)
Fungsi bawaan ini mengembalikan true jika objek darisize
byte selalu menghasilkan instruksi atom bebas kunci untuk arsitektur target.size
harus menyelesaikan ke konstanta waktu kompilasi dan hasilnya juga menyelesaikan ke konstanta waktu kompilasi.
ptr
adalah pointer opsional ke objek yang dapat digunakan untuk menentukan perataan. Nilai0
menunjukkan keselarasan khas harus digunakan. Kompiler juga dapat mengabaikan parameter ini.if (_atomic_always_lock_free (sizeof (long long), 0))
primitif atom 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
Ditambahkan di glibc 2.28. Diuji di Ubuntu 18.04 (glibc 2.27) dengan mengompilasi glibc dari sumber:Beberapa pustaka glibc pada satu host Kemudian juga diuji di Ubuntu 20.04, glibc 2.31.
Contoh diadaptasi dari: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);
}
Kompilasi dan jalankan:
gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c -pthread
./main.out
Keluaran yang mungkin:
The atomic counter is 10000
The non-atomic counter is 8644
Penghitung non-atomik kemungkinan besar lebih kecil daripada penghitung atom karena akses cabul melintasi utas ke variabel non-atomik.
Analisis pembongkaran di:Bagaimana cara memulai utas di C biasa?