Ich habe eine Frage, wie Monitor.Enter funktioniert. Ich untersuchte den .net-Framework-Quellcode, und es zeigt dies nur:
%Vor%Ich nehme an, Monitor.Enter Implementierung ist plattformabhängig, also habe ich Mono Quellcode durchsucht und ich habe aufgegeben: (
Ja, ein kritischer Abschnitt, der für jede System.Object-Instanz zugewiesen wurde, löst möglicherweise, aber ich glaube nicht, dass die tatsächliche Monitor.Lock so geschrieben wird, da das Erstellen eines kritischen Abschnitts für jedes System.Object unbegrenzt kostet. (Win32 erlaubt Milliarden von kritischen Sektionsobjekten in einem Prozess nicht!)
Weiß jemand, wie Monitor.Enter funktioniert? Bitte antworte. Danke im Voraus.
Wenn Sie sich den Mono-Quellcode ansehen, scheint es, als würden sie einen Semaphor erstellen (mit CreateSemaphore
oder eine ähnliche plattformspezifische Funktion), wenn das Objekt zum ersten Mal gesperrt wird, und speichert es im Objekt. Es scheint auch etwas Objektpooling mit den Semaphoren und den ihnen zugeordneten MonoThreadsSync-Strukturen zu geben.
Die relevante Funktion ist static inline gint32 mono_monitor_try_enter_internal (MonoObject *obj, guint32 ms, gboolean allow_interruption)
in der Datei mono/metadata/monitor.c
, falls Sie interessiert sind.
Ich erwarte, dass Microsoft .Net etwas Ähnliches tut.
Microsoft .NET versucht nach Möglichkeit eine Spinlock auf der Thin Lock-Struktur im Objektkopf. (Beachten Sie, wie Sie ein Objekt "sperren" können.)
Nur wenn es notwendig ist, wird ein Ereignis-Handle aus dem Pool verwendet oder ein neues zugewiesen.
Tags und Links .net multithreading