C incorporado o asm en línea para bloqueo ORe
¿Hay alguna función incorporada para esta operación (en C)?
lock or QWORD [...], ...
De hecho, estoy buscando el uso de lock or
en C.
Si no hay ninguna función incorporada, ¿cómo puedo escribirlo en C usando ensamblador inline?
Estoy utilizando GCC (versión C 11).
davy.ai
La operación
lock or
es específica de la programación en ensamblador x86-64 y no está disponible directamente en C. Sin embargo, puedes lograr la misma funcionalidad en C utilizando el código inline-asm y la función integrada__sync_fetch_and_or()
. Esta función realiza la operación OR a nivel de bit especificada en la variable atómica proporcionada y devuelve el valor anterior de la variable. También se asegura de que la operación se realice de forma atómica, es decir, sin que otros hilos interfieran.Aquí tienes un ejemplo de cómo puedes usar
__sync_fetch_and_or()
para implementar la operaciónlock or
:En este ejemplo, primero inicializamos
var
con un valor (0x12345678
) ynew_val
con el valor con el que queremos hacer el OR avar
(0xabcdef00
). Luego usamos la función__sync_fetch_and_or()
para realizar la operación lock or envar
. La función devuelve el valor anterior devar
(0x12345678
), que almacenamos enprev_val
. Finalmente, imprimimos tantoprev_val
como el valor actualizado devar
(0xabcdef78
).Ten en cuenta que la función
__sync_fetch_and_or()
es específica de GCC y puede que no esté disponible en otros compiladores. Además, se recomienda utilizar las funciones integradas atómicas (<stdatomic.h>
) en lugar de las funciones integradas de GNU (__sync_*
) en nuevo código, ya que son más portables entre diferentes compiladores y plataformas.</stdatomic.h></stdio.h>