Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

_WriteBarrier

Específicos de Microsoft

Fuerza etiquetas a memoria para completar actualmente la llamada.

Nota de precaución Precaución

_ReadBarrier , _WriteBarrier, y los intrínsecos del compilador de _ReadWriteBarrier evitan sólo reordenar del compilador. Para evitar que la CPU reordenar operaciones de lectura y escritura, utilice la macro de MemoryBarrier .

void _WriteBarrier(void);

Intrínseco

Arquitectura

_WriteBarrier

x86, IPF, x64

Archivo de encabezado <intrin.h>

_ReadBarrier, _WriteBarrier, y la ayuda de las funciones de _ReadWriteBarrier aseguran la operación adecuada de programas multiproceso que están optimizados por el compilador de Visual C++ . Un programa correctamente optimizado produce el mismo resultado cuando se ejecuta en varios subprocesos como cuando se ejecuta en un subproceso único.

Para asegurarse de que el programa optimizado funciona correctamente, la función de _WriteBarrier fuerza etiquetas a memoria para completar actualmente la llamada. Después de la llamada, otros subprocesos pueden tener acceso a la memoria sin miedo que el subproceso que realice la llamada podría tener una escritura pendiente en memoria. Para obtener más información, vea los comentarios de _ReadWriteBarrier.

Nota Nota

En las últimas versiones del compilador de Visual C++ , _ReadWriteBarrier y las funciones de _WriteBarrier se aplicaran solo localmente y no afectaron a funciones en todo el árbol de llamadas. Estas funciones se aplican hasta el final sobre el árbol de llamadas.

El ejemplo siguiente es similar al mostrado en más _ReadWriteBarrier. La función f crea dos asignaciones a la variable local x. Sin _WriteBarrier la primera asignación se optimiza aún como asignación irrelevante. Con _WriteBarrier en contexto se conservan ambas asignaciones y produce una infracción de acceso cuando la primera asignación intenta desreferenciar un puntero NULL.

// intrinsics_writebarrier.c
// compile with: /O2 -DNO_BARRIER
// This code contains an error--dereferencing a null pointer--
// which will be optimized away as a useless assignment.
// Omit the NO_BARRIER command line to activate the Write Barrier.
// With the barrier activated, the assignment is not optimized away
// and causes an access violation.

#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
#include <stdio.h>
#include <intrin.h>

#pragma intrinsic(_WriteBarrier)

int x = 0;

__declspec(noinline) int f(int* p)
{
    x = *p;
#ifndef NO_BARRIER
    _WriteBarrier();
#endif
    x = 7;
    return x;
}


// If code is EXCEPTION_ACCESS_VIOLATION it should be the
// attempt to read from the NULL pointer we passed in, so
// we handle the exception.
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
    if (code == EXCEPTION_ACCESS_VIOLATION)
    {
        printf_s("AV\n");
        return EXCEPTION_EXECUTE_HANDLER;
    }

    // If not what we were looking for, we don't want to handle it.
    return EXCEPTION_CONTINUE_SEARCH;
}

int main()
{
    __try
    {
        // Should return only if the first assignment is
        // optimized away.
        f(NULL);
        printf_s("Assignment was optimized away!\n");
    }
    __except(filter(GetExceptionCode(), GetExceptionInformation()))
    {
        // We get here if an Access violation occurred.
        printf_s("Access Violation: assignment was not optimized away.\n");
    }
}

Sin /DNO_BARRIER:

AV
Access Violation: assignment was not optimized away.

Con /DNO_BARRIER:

Assignment was optimized away!

Adiciones de comunidad

AGREGAR
Mostrar: