Dans .NET le mot-clé lock
est le sucre syntaxique autour Monitor.Enter
et Monitor.Exit
, donc on peut dire que ce codeQuand utiliser le verrouillage vs MemoryBarrier dans .NET
lock(locker)
{
// Do something
}
est le même que
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
Cependant, le .NET Framework inclut également la classe MemoryBarrier
qui fonctionne d'une manière similaire
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
Je suis confus comme quand je voudrais utiliser Thread.MemoryBarrier
sur la version lock
/Monitor
? Je suis rendu encore plus confus par a Threading Tutorial qui déclare qu'ils fonctionnent le même. Dans la mesure où je peux voir la différence visible n'a pas besoin d'un objet de verrouillage, je suppose qu'en utilisant Monitor
vous pouvez faire quelque chose à travers les threads MemoryBarrier
sur un seul thread. Mon instinct me dit qu'une autre différence clé est MemoryBarrier
est pour les variables seulement et pas pour les méthodes.
Enfin, ce n'est pas lié à la question existante When to use ‘volatile’ or ‘Thread.MemoryBarrier()’ in threadsafe locking code? (C#), car cela se concentre sur le mot-clé volatile
dont je comprends l'utilisation.
Dans le didacticiel de Joe (sur la page je lie à), recherchez «Barrières de mémoire et verrouillage». Un court paragraphe indique qu'elles sont équivalentes «si nous ignorons la garantie d'exclusion mutuelle d'un verrou». –
Cependant, ignorer l'exclusion mutuelle rend la comparaison inutile car elle fait partie intégrante des verrous – Grizzly
@Grizzly: La comparaison n'est pas inutile - elle est utile en termes de * clôtures *. Mais ce n'est pas la même chose que de dire que les deux choses «fonctionnent de la même manière» - parce que la garantie d'exclusion mutuelle est le principal point de blocage. –