GNU/Linux >> Znalost Linux >  >> Linux

Jak používat atomové proměnné v C?

Pokud na své platformě CentOS používáte GCC, můžete použít __atomic vestavěné funkce.

Zvláště zajímavá by mohla být tato funkce:

— Vestavěná funkce:bool __atomic_always_lock_free (size_t size, void *ptr)
Tato vestavěná funkce vrací hodnotu true, pokud objekty size bajtů vždy generují atomické instrukce bez zámku pro cílovou architekturu. size musí být vyřešen na konstantu v době kompilace a výsledek se také překládá na konstantu v době kompilace.

ptr je volitelný ukazatel na objekt, který lze použít k určení zarovnání. Hodnota 0 označuje, že by se mělo použít typické zarovnání. Kompilátor může tento parametr také ignorovat.

      if (_atomic_always_lock_free (sizeof (long long), 0))

Atomová primitiva 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

Přidáno v glibc 2.28. Testováno v Ubuntu 18.04 (glibc 2.27) kompilací glibc ze zdroje:Více knihoven glibc na jednom hostiteli Později také testováno na Ubuntu 20.04, glibc 2.31.

Příklad upraven z: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);
}

Kompilace a spuštění:

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c -pthread
./main.out

Možný výstup:

The atomic counter is 10000
The non-atomic counter is 8644

Neatomové počítadlo bude velmi pravděpodobně menší než atomové, a to z důvodu rychlého přístupu přes vlákna k neatomové proměnné.

Analýza demontáže na adrese:Jak spustím vlákna v prostém C?


Linux
  1. Jak používat BusyBox na Linuxu

  2. Jak používat příkazy historie Bash

  3. Jak používat Su Command v Linuxu

  1. Jak používám cron v Linuxu

  2. Jak používat FIND v Linuxu

  3. Jak používat dos2unix?

  1. Jak používám nastavení usnadnění přístupu v systému Linux

  2. Jak používat Nginx k přesměrování

  3. jak používat pylint ve vim