transacciones sistemas que operativos operaciones informatica datos bases atomicidad atomicas atomicamente c concurrency posix atomic

sistemas - que es la atomicidad en bases de datos



Operaciones atómicas portátiles de UNIX (6)

AFAIK no hay formas multiplataforma para hacer operaciones atómicas. Puede que haya una biblioteca pero no sé. Sin embargo, no es particularmente difícil hacerlo tú mismo.

¿Hay un camino (POSIX-) portátil en C para operaciones de variable atómica similar a un enhebrado portátil con pthread?

Las operaciones atómicas son operaciones como "incrementar y obtener" que se ejecutan atómicamente, lo que significa que ningún cambio de contexto puede interferir con la operación. En el espacio del kernel de Linux, tenemos que atomic_t type, en Java tenemos el paquete java.util.concurrent.atomic .

En Linux, el archivo atomic.h proporciona operaciones atómicas, pero el include depende de la plataforma, por ejemplo, #include <asm-x86_64/atomic.h> y no está disponible en Mac OS X de manera similar.


No creo que exista.

Una forma de resolverlo, por ejemplo, las licencias que lo permitan, sería copiar las implementaciones pertinentes por arquitectura, por ejemplo, del espacio del kernel de Linux. No he seguido de cerca la evolución de esas primitivas, pero supongo que en realidad son primitivas, es decir, no dependen de otros servicios o API en el kernel.


No, POSIX no especifica ninguna operación portátil sin cerradura / atómica. Es por eso que tienen pthreads.

Tendrás que usar formas no estándar o seguir las pautas para la portabilidad.


Como solicitó OS X:

(y desde la plataforma cruzada se planteó en este hilo).

OS X tiene funciones OSAtomicAdd32 () y amigos. Se declaran en "/usr/include/libkern/OSAtomic.h". Consulte la guía de programación de Threading , sección "Uso de operaciones atómicas".

Y para Windows, hay InterlockedIncrement () y amigos (vea MSDN).

Junto con las incorporaciones de gcc __sync_fetch_and_add () y amigos (se ha vinculado anteriormente), debe tener algo para cada plataforma de escritorio principal.

Tenga en cuenta que aún no los uso yo solo, pero quizás lo haga en los próximos días.


Para cualquiera que tropiece con esto en el futuro, C11 atómica es la mejor manera de hacer esto ahora: creo que se incluirán en GCC 4.9.


A partir de C11 hay una biblioteca Atómica opcional que proporciona operaciones atómicas. Esto es portátil para cualquier plataforma que tenga un compilador C11 (como gcc-4.9) con esta característica opcional.

La presencia del __STDC_NO_ATOMICS__ se puede verificar con __STDC_NO_ATOMICS__ y la presencia de <stdatomic.h>

atomic.c

#include <stdio.h> #include <stdlib.h> #ifndef __STDC_NO_ATOMICS__ #include <stdatomic.h> #endif int main(int argc, char**argv) { _Atomic int a; atomic_init(&a, 42); atomic_store(&a, 5); int b = atomic_load(&a); printf("b = %i/n", b); return EXIT_SUCCESS; }

Invocaciones de compilador

clang -std=c11 atomic.c gcc -std=c11 atomic.c