GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie mache ich ein atomares Inkrement und hole es in C?

GCC unterstützt atomare Operationen:

gcc Atomic


GCC __atomic_* eingebaut

Ab GCC 4.8, __sync Built-ins wurden zugunsten von __atomic verworfen Built-ins:https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html

Sie implementieren das C++-Speichermodell und std::atomic verwendet sie intern.

Das folgende Beispiel für POSIX-Threads schlägt konsistent mit ++ fehl auf x86-64 und funktioniert immer mit _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;
}

Kompilieren und ausführen:

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

Disassemblierungsanalyse unter:Wie starte ich Threads in einfachem C?

Getestet in Ubuntu 18.10, GCC 8.2.0, glibc 2.28.

C11 _Atomic

In 5.1 funktioniert der obige Code mit:

_Atomic int global = 0;
global++;

Und C11 threads.h wurde in glibc 2.28 hinzugefügt, wodurch Sie Threads in reinem ANSI C ohne POSIX erstellen können, minimal lauffähiges Beispiel:Wie starte ich Threads in einfachem C?


Linux
  1. Wie installiere ich gcc 4.7?

  2. Gewusst wie:DRBD-Replikation und -Konfiguration

  3. Wie verwende ich atomare Variablen in C?

  4. wie man gcc 4.9.2 auf RHEL 7.4 installiert

  5. Wie setze ich RPATH und RUNPATH mit GCC/LD?

So installieren und konfigurieren Sie SeedDMS

So installieren Sie die GCC-Compiler-Sammlung unter CentOS 8 und Rocky Linux 8

So installieren Sie GCC unter CentOS 7

So installieren und konfigurieren Sie Grafana

Wie vernetzt man Ubuntu und Windows 10?

So installieren und verwenden Sie den GCC-Compiler auf einem Linux-System