Hier ist also mein benutzerdefiniertes Dienstprogramm für doppelt geprüftes Sperren: Es ist eine statische Methode, in die Sie das Kriterium, das Synchronisierungsobjekt und die auszuführende Aktion eingeben.Ist es möglich, einen Test zu erstellen, der das Fehlschlagen der doppelten Überprüfung in C# anzeigt?
public static bool RunIf(Func<bool> criterion, object syncObject, Action action)
{
if (criterion())
lock(syncObject)
if (criterion())
{
Thread.MemoryBarrier();
action();
return true;
}
return false;
}
Ich bin, das zu verstehen gegeben, nach der C# Spezifikation ist es möglich, für Optimisern Speicherzuordnungen in einer solchen Art und Weise neu zu ordnen, dass ohne die Speicherbarriere kann diese Technik ein falsch positives geben und führen die Aktion, wenn es nicht sollte. Wenn in meiner kleinen Welt ein solcher Fehler möglich ist, sollte es auch möglich sein, einen Test zu entwickeln, der den Fehler konsequent demonstriert, indem er das Szenario mit einer ausreichenden Anzahl paralleler Testfälle hart genug trifft. Ich bin seit ungefähr einem Jahr auf der Suche nach einem solchen Test, aber bis jetzt habe ich eine Lücke gezogen. Kann mir jemand einen Test zeigen, dass:
zeigt den Ausfall dieser Methode in Abwesenheit der Speicherbarriere;
zeigt seinen Erfolg, wenn der Test mit der wiederhergestellten Speicherbarriere wiederholt wird?
Ich glaube, .NET Framework auf x86 hat stärker Speichermodell als was die C# -Spezifikation erfordert, so dass Sie nicht in der Lage, einen solchen Test zu erstellen. Möglicherweise haben Sie mehr Glück auf ARM (d. H. Windows RT), die ein schwächeres Speichermodell hat. – svick
svick ist korrekt. Schauen Sie sich [diesen MSDN-Artikel] (http://msdn.microsoft.com/en-us/magazine/cc163715.aspx#S5) an, der über das stärkere Speichermodell für .Net 2+ spricht. –