GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menggunakan variabel atom di C?

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 dari size 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. Nilai 0 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?


Linux
  1. Cara menggunakan BusyBox di Linux

  2. Cara menggunakan Perintah Su di Linux

  3. cara menggunakan pylint di vim

  1. Cara menggunakan perintah riwayat Bash

  2. Bagaimana saya menggunakan cron di Linux

  3. Bagaimana cara menggunakan dos2unix?

  1. Bagaimana saya menggunakan pengaturan aksesibilitas Linux

  2. Cara menggunakan FIND di Linux

  3. Cara Menggunakan Nginx untuk Mengarahkan