2

VisualC++とWindows7およびXPを使用しています。プログラムに2つのスレッドがあり、両方が作成された後、1つのスレッドが動的にバッファーを作成し、そのアドレスをグローバルポインターに割り当ててから、そのバッファーにデータを書き込みます。_ReadWriteBarrierを呼び出すと、2番目のスレッドに対するそのデータの可視性が保証されますか?

例えば:

char *buff;
HANDLE EventObject;

main()
{
    // Create an event object so we can signal the second thread
    // when it is time to read the buffer.

    EventObject = CreateEvent(NULL, TRUE, FALSE, NULL);

    // Create the second thread.

    CreateThread(NULL, 0, ThreadProc, NULL, 0);

    // Allocate the buffer.

    buff = (char*)malloc(100);

    // Write some data to the buffer.

    buff[50] = rand() % 256;

    // Set the fence here.

    _ReadWriteBarrier();

    // Signal the other thread that data is ready.

    SetEvent(EventObject);

    // Go on our merry way in this thread.
    .
    .
    .
}

ThreadProc(void* p)
{

    // Wait for the signal that data is ready.

    WaitForSingleObject(EventObject, INFINITE);

    // Read the data written to the buffer.

    printf("%d\n", buff[50]);
}

グローバル変数と同様に、のアドレスの可視性を保証するドキュメントから私は信じています。しかし、それはまた、で作成されたバッファ自体の可視性を保証しますか?それも必要ですか?_ReadWriteBarrierbuffbuffmain

4

1 に答える 1