GNU/Linux >> Znalost Linux >  >> Linux

Jak provést atomový přírůstek a načtení v C?

GCC podporuje atomové operace:

gcc atomics


GCC __atomic_* vestavěné

Od GCC 4.8, __sync vestavěné moduly byly zastaralé ve prospěch __atomic vestavěné:https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html

Implementují paměťový model C++ a std::atomic používá je vnitřně.

Následující příklad vláken POSIX selže konzistentně s ++ na x86-64 a vždy funguje s _atomic_fetch_add .

main.c

#include <assert.h>
#include <pthread.h>
#include <stdlib.h>

enum CONSTANTS {
    NUM_THREADS = 1000,
    NUM_ITERS = 1000
};

int global = 0;

void* main_thread(void *arg) {
    int i;
    for (i = 0; i < NUM_ITERS; ++i) {
        __atomic_fetch_add(&global, 1, __ATOMIC_SEQ_CST);
        /* This fails consistently. */
        /*global++*/;
    }
    return NULL;
}

int main(void) {
    int i;
    pthread_t threads[NUM_THREADS];
    for (i = 0; i < NUM_THREADS; ++i)
        pthread_create(&threads[i], NULL, main_thread, NULL);
    for (i = 0; i < NUM_THREADS; ++i)
        pthread_join(threads[i], NULL); 
    assert(global == NUM_THREADS * NUM_ITERS);
    return EXIT_SUCCESS;
}

Kompilace a spuštění:

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

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

Testováno v Ubuntu 18.10, GCC 8.2.0, glibc 2.28.

C11 _Atomic

Ve verzi 5.1 výše uvedený kód pracuje s:

_Atomic int global = 0;
global++;

A C11 threads.h byl přidán v glibc 2.28, což vám umožňuje vytvářet vlákna v čistém ANSI C bez POSIX, minimální spustitelný příklad:Jak spustím vlákna v prostém C?


Linux
  1. Jak nainstalovat Gcc 4.7?

  2. Jak na to:Replikace a konfigurace DRBD

  3. jak nainstalovat gcc 4.9.2 na RHEL 7.4

  1. Jak duální bootování Linuxu a Windows

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

  3. Jak nastavit RPATH a RUNPATH s GCC/LD?

  1. Jak nainstalovat Elasticsearch a Kibana na Linux

  2. Jak rozdělit a naformátovat disk v systému Linux

  3. Co je to chroot jail a jak jej používat?