Неявные барьеры памяти

скажем, у меня есть переменные A, B и C, которые разделяют два потока (T1, T2).
у меня есть следующий код:

//T1  
//~~

A = 1;  
B = 1;  
C = 1;

InterlockedExchange(ref Foo, 1);

//T2  (executes AFTER T1 calls InterlockedExchange)  
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

InterlockedExchange(ref Bar, 1);

WriteLine(A);  
WriteLine(B);  
WriteLine(C);  

Вопрос:
вызывает ли вызов InterlockedExchange (неявное полное ограничение) на T1 и T2 уверенность в том, что T2 "увидит" запись, выполненную T1 до ограничения? (переменные A, B и C), даже если эти переменные не находятся в той же строке кэша, что и Foo и Bar?


person foo    schedule 13.05.2010    source источник


Ответы (1)


Да. Забор памяти не зависит от переменной; это приводит к завершению всех операций загрузки и сохранения, выполненных вызывающим потоком до ограничения.

Я могу ошибаться, но я подозреваю, что забор, выданный Т2, бесполезен - Т1 выдал магазины; забор, выданный T2, завершит любые загрузки/сохранения, выданные T2 до этого момента. Это не приведет к видимости магазинов, выданных T1.

person Community    schedule 28.05.2010