GNU/Linux >> Linux Esercitazione >  >> Linux

Come usare le variabili atomiche in C?

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 di size i byte generano sempre istruzioni atomiche senza blocco per l'architettura di destinazione. size deve 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 di 0 indica 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?


Linux
  1. Come usare BusyBox su Linux

  2. Come usare i comandi della cronologia di Bash

  3. Come uso cron in Linux

  4. Come utilizzare Nginx per reindirizzare

  5. Come usare dos2unix?

Come utilizzare le variabili in Ansible Playbook

Come utilizzare le variabili negli script della shell

Come utilizzare Instagram nel terminale

Come usare il comando PS

Come usare il comando TOP

Come utilizzare FTP