2012-06-01 7 views
1

Я использую Visual C++ и Windows 7 и XP. У меня есть два потока в программе, где после их создания один поток динамически создает буфер и присваивает свой адрес глобальному указателю, а затем записывает данные в этот буфер. Будет ли вызов _ReadWriteBarrier гарантировать видимость этих данных во втором потоке?Does _ReadWriteBarrier Обеспечивает видимость динамически распределенных буферов по потокам?

Например:

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]); 
} 

Я считаю, из the documentation что _ReadWriteBarrier гарантирует видимость адреса в buff как buff является глобальной переменной. Но это также гарантирует видимость самого буфера , который был создан в main? Это даже необходимо?

ответ

2

Если вы используете SetEvent, вам не нужно иметь барьер вообще. Событие позаботится об этом.

Как правило, для барьеров, имеющих видимый эффект, вам нужны они с обеих сторон (написание и чтение). Поскольку SetEvent/WaitForSingleObject действуют как барьеры, все в порядке.

+0

Это замечательная информация! Можете ли вы указать мне на какой-нибудь документ, подтверждающий это? Я копал и копал страницы MSDN на этом и ничего не могу найти на нем, кроме вызовов барьера. Примечательно, что ближайший пример Microsoft (см. [Здесь] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686915 (v = vs.85) .aspx)) не показывает фактический доступ в памяти, поэтому я задаюсь вопросом, должно ли оно быть глобальным (как это требуется [здесь] (http://msdn.microsoft.com/en-us/library/windows/desktop/f20w0x5e (v = vs .85) .aspx). –

+1

А, вот это! Это немного наклонно, но это [на MSDN] (http://msdn.microsoft.com/en-us/library/ms686355%28VS.85%29. aspx). stackoverflow.com - это нечто вроде удивительного, иногда. Найди его, ища соответствующий вопрос, который я нашел [здесь] (http://stackoverflow.com/questions/1967852/does-waitforsingleobject-serve-as-a- барьер памяти). Мне жаль, что они не станут более откровенными в отношении динамически распределенного пространства, хотя ... В любом случае, спасибо! Отметьте свой ответ как принятый. –