GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara melakukan peningkatan atom dan mengambil di C?

GCC mendukung operasi atom:

atom gcc


GCC __atomic_* bawaan

Sejak GCC 4.8, __sync built-in telah ditinggalkan demi __atomic bawaan:https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html

Mereka menerapkan model memori C++, dan std::atomic menggunakannya secara internal.

Contoh utas POSIX berikut gagal secara konsisten dengan ++ di x86-64, dan selalu berfungsi dengan _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;
}

Kompilasi dan jalankan:

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

Analisis pembongkaran di:Bagaimana cara memulai utas di C biasa?

Diuji di Ubuntu 18.10, GCC 8.2.0, glibc 2.28.

C11 _Atomic

Di 5.1, kode di atas berfungsi dengan:

_Atomic int global = 0;
global++;

Dan C11 threads.h telah ditambahkan di glibc 2.28, yang memungkinkan Anda membuat utas dalam ANSI C murni tanpa POSIX, contoh minimal yang dapat dijalankan:Bagaimana cara memulai utas dalam C biasa?


Linux
  1. Bagaimana Cara Menginstal Gcc 4.7?

  2. Cara:Replikasi dan Konfigurasi DRBD

  3. Bagaimana cara menggunakan variabel atom di C?

  1. Cara dual-boot Linux dan Windows

  2. cara menginstal gcc 4.9.2 di RHEL 7.4

  3. Bagaimana cara mengatur RPATH dan RUNPATH dengan GCC/LD?

  1. Cara menginstal Elasticsearch dan Kibana di Linux

  2. Cara mempartisi dan memformat drive di Linux

  3. Apa itu chroot jail dan Bagaimana Cara Menggunakannya?