Я использую 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
? Это даже необходимо?
Это замечательная информация! Можете ли вы указать мне на какой-нибудь документ, подтверждающий это? Я копал и копал страницы 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). –
А, вот это! Это немного наклонно, но это [на 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- барьер памяти). Мне жаль, что они не станут более откровенными в отношении динамически распределенного пространства, хотя ... В любом случае, спасибо! Отметьте свой ответ как принятый. –