GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo hacer un incremento atómico y buscar en C?

GCC admite operaciones atómicas:

gcc atómicos


CCG __atomic_* integrados

A partir de GCC 4.8, __sync los elementos incorporados han quedado obsoletos a favor del __atomic integrados:https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html

Implementan el modelo de memoria C++ y std::atomic los utiliza internamente.

El siguiente ejemplo de subprocesos POSIX falla consistentemente con ++ en x86-64, y siempre funciona con _atomic_fetch_add .

principal.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;
}

Compilar y ejecutar:

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

Análisis de desensamblaje en:¿Cómo empiezo subprocesos en C simple?

Probado en Ubuntu 18.10, GCC 8.2.0, glibc 2.28.

C11 _Atomic

En 5.1, el código anterior funciona con:

_Atomic int global = 0;
global++;

Y C11 threads.h se agregó en glibc 2.28, lo que le permite crear subprocesos en ANSI C puro sin POSIX, ejemplo ejecutable mínimo:¿Cómo inicio subprocesos en C simple?


Linux
  1. ¿Cómo instalar Gcc 4.7?

  2. Cómo:replicación y configuración de DRBD

  3. ¿Cómo usar variables atómicas en C?

  4. cómo instalar gcc 4.9.2 en RHEL 7.4

  5. ¿Cómo configurar RPATH y RUNPATH con GCC/LD?

Cómo instalar y configurar SeedDMS

Cómo instalar la colección de compiladores GCC en CentOS 8 y Rocky Linux 8

Cómo instalar GCC en CentOS 7

Cómo instalar y configurar Grafana

¿Cómo conectar en red Ubuntu y Windows 10?

Cómo instalar y usar el compilador GCC en el sistema Linux