es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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).

Tags:  , , , ,

Answer

  1. Avatar for 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ón lock or:

    #include <stdio.h>
    
    int main() {
        int var = 0x12345678;
        int new_val = 0xabcdef00;
    
        // Realizar la operación lock or en var
        int prev_val = __sync_fetch_and_or(&var, new_val);
    
        printf("prev_val = 0x%x, var = 0x%x\n", prev_val, var);
    
        return 0;
    }
    

    En este ejemplo, primero inicializamos var con un valor (0x12345678) y new_val con el valor con el que queremos hacer el OR a var (0xabcdef00). Luego usamos la función __sync_fetch_and_or() para realizar la operación lock or en var. La función devuelve el valor anterior de var (0x12345678), que almacenamos en prev_val. Finalmente, imprimimos tanto prev_val como el valor actualizado de var (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>

Comments are closed.