Oto moje własne narzędzie do podwójnego sprawdzania blokowania: jest to statyczna metoda, do której podajesz kryterium, obiekt synchronizacji i akcję, która ma zostać wykonana.Czy jest możliwe utworzenie testu pokazującego niepowodzenie podwójnie sprawdzanego blokowania w języku C#?
public static bool RunIf(Func<bool> criterion, object syncObject, Action action)
{
if (criterion())
lock(syncObject)
if (criterion())
{
Thread.MemoryBarrier();
action();
return true;
}
return false;
}
ja dać do zrozumienia, że w zależności od specyfikacji C# jest możliwe do optymalizacji zmienić kolejność alokacji pamięci w taki sposób, że bez bariery pamięci, technika ta może dać fałszywie dodatnich i wykonać działanie, kiedy nie powinno.
W moim małym świecie, jeśli taka awaria jest możliwa, powinno być również możliwe opracowanie testu, który wykaże awarię konsekwentnie przez trafienie scenariusza wystarczająco mocno z wystarczającą liczbą równoległych przypadków testowych. Tego rodzaju test szukam od około roku, ale do tej pory narysowałem pustkę. Czy ktoś może mi pokazać test, który:
pokazuje awarię tej metody w przypadku braku bariery pamięci;
pokazuje swój sukces po powtórzeniu testu z przywróconą barierą pamięci?
Wierzę, że framework .Net na architekturze x86 ma silniejszy model pamięci niż wymaga specyfikacji C#, więc nie będzie można utworzyć takiego testu. Możesz mieć więcej szczęścia na ARM (np. Windows RT), który ma słabszy model pamięci. – svick
svick jest poprawny. Sprawdź [ten artykuł MSDN] (http://msdn.microsoft.com/en-us/magazine/cc163715.aspx#S5), który mówi o silniejszym modelu pamięci dla .Net 2+. –