Share via


_WriteBarrier

Microsoft-spezifisch

Erzwingt schreibt in den Speicher, um zum Zeitpunkt des Aufrufs abzuschließen.

WarnhinweisVorsicht

_ReadBarrier, _WriteBarrier und _ReadWriteBarrier systeminterne Funktionen des Compilers Compiler verhindern, dass nur neu anordnen.Um die CPU am Neuanordnung gelesen und an den Schreibvorgängen zu verhindern, verwenden Sie das Makro MemoryBarrier.

void _WriteBarrier(void);

Anforderungen

Intrinsisch

Architektur

_WriteBarrier

x86, IPF, x64

Headerdatei <intrin.h>

Hinweise

_ReadBarrier, _WriteBarrier und die Funktionen _ReadWriteBarrier sinngemässe Funktion von Multithreading Programmen sichergestellt werden, die vom Visual C++ Compiler optimiert werden.Ein ordnungsgemäß optimiertes Programm führt dieselben Ergebnisse, wenn sie in mehreren Threads z. B. ausführt, wenn es auf einem einzigen Thread ausgeführt wird.

Um sicherzustellen, dass das optimierte Programm ordnungsgemäß funktioniert, erzwingt die _WriteBarrier-Funktion schreibt in den Speicher um zum Zeitpunkt des Aufrufs abzuschließen.Nach dem Aufruf können andere Threads den Arbeitsspeicher, ohne Furcht zugreifen, dass der Thread, der den Aufruf ausgeführt wurde, ein ausstehendes Schreiben in den Arbeitsspeicher. h.Weitere Informationen finden Sie in den Hinweisen im _ReadWriteBarrier.

HinweisHinweis

In früheren Versionen von Visual C++ Compilers _ReadWriteBarrier wurden, und die _WriteBarrier Features nur lokal erzwungen und keine Funktionen in der Aufrufstruktur betreffen.Diese Funktionen sind jetzt alle in der Aufrufstruktur erzwungen.

Beispiel

Das folgende Beispiel ist mit dem vergleichbar, das in _ReadWriteBarrier dargestellt wird.Die Funktion f macht zwei Zuweisungen zur lokalen Variablen x.Ohne _WriteBarrier wird die erste Zuweisung als Off unbrauchbare Zuweisung optimiert.Mit _WriteBarrier an der Stelle werden beide Zuweisungen beibehalten und eine Zugriffsverletzung tritt auf, wenn die erste Zuweisung versucht, einen NULL-Zeiger zu dereferenzieren.

// 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");
    }
}

Beispielausgabe

Ohne /DNO_BARRIER:

AV
Access Violation: assignment was not optimized away.

Mit /DNO_BARRIER:

Assignment was optimized away!

Siehe auch

Referenz

_ReadBarrier

_ReadWriteBarrier

Systeminterne Funktionen des Compilers