Wenn es mehrere Threads gibt, die alle auf dasselbe Schloss warten, ist es möglich, dass der Haupt-Thread eine höhere Priorität beim Erlangen des Schlosses hat. Das bedeutet, wenn Worker-Threads vor dem Hauptthread zur lock
-Anweisung wechseln, erhält der Hauptthread die Sperre vor den anderen Threads, die bereits darauf warten.C# ist es möglich, die Priorität der Erlangung einer Sperre zu ändern?
Antwort
Nein, die lock
-Anweisung entspricht System.Threading.Monitor.Enter()
(MSDN) und es gibt keine Überlastung, die einen Prioritätsparameter akzeptiert.
Die nächste Sache, die ich denken kann, ist ein ReaderWriterLock (Slim), aber ich würde ernsthaft überdenken, das Design, das zu dieser Anfrage führt. Es gibt wahrscheinlich bessere Möglichkeiten, um das zu erreichen, was Sie brauchen.
Durch eine native Lock-Anweisung, nein. Durch Ihren eigenen benutzerdefinierten Schließmechanismus, sicher, wenn Sie bereit sind, die Zeit und Mühe zu investieren, um es zu entwickeln.
Hier ist mein Entwurf eine Lösung. Es kann oder möglicherweise nicht arbeiten, und ist möglicherweise nicht super effizient, aber es ist mindestens ein Ausgangspunkt:
public class Lock
{
bool locked = false;
private object key = new object();
SortedDictionary<int, Queue<ManualResetEvent>> notifiers =
new SortedDictionary<int, Queue<ManualResetEvent>>();
ManualResetEvent specialNotifier = null;
public void Lock()
{
lock (key)
{
if (locked)
{
ManualResetEvent notifier = new ManualResetEvent(false);
int priority = getPriorityForThread();
Queue<ManualResetEvent> queue = notifiers[priority];
if (queue == null)
{
queue = new Queue<ManualResetEvent>();
notifiers[priority] = queue;
}
queue.Enqueue(notifier);
notifier.WaitOne();
}
else
{
locked = true;
}
}
}
private static int getPriorityForThread()
{
return 0;
}
public void Release()
{
lock (key)
{
foreach (var queue in notifiers.Values)
{
if (queue.Any())
{
var notifier = queue.Dequeue();
notifier.Set();
return;
}
}
locked = false;
}
}
}
Hier ist eine andere Lösung. Ich habe viele Zeilen, aber es ist ziemlich einfach. Die Funktion DoSomethingSingle
wird nur ein Thread gleichzeitig aufgerufen, und diejenigen mit dem highPriority
Flag werden bevorzugt.
static int numWaiting = 0;
static object single = new object();
ResultType DoSomething(string[] argList, bool highPriority = false)
{
try
{
if (highPriority)
{
Interlocked.Increment(ref numWaiting);
}
for (;;)
{
lock (single)
{
if (highPriority || numWaiting == 0)
{
return DoSomethingSingle(argList);
}
}
// Sleep gives other threads a chance to enter the lock
Thread.Sleep(0);
}
}
finally
{
if (highPriority)
{
Interlocked.Decrement(ref numWaiting);
}
}
}
Dies ermöglicht zwei Prioritätsstufen. Garantiert, dass ein Thread mit niedriger Priorität nur dann auf die Ressource zugreifen kann, wenn keine Threads mit hoher Priorität darauf warten.
edit: Änderung Interlock incr/dec
- 1. Ist es möglich, einer CSS-Klasse Priorität zu geben?
- 2. WPF - ist es möglich, die Deckkraft einer GridColumn zu ändern?
- 3. Ist es möglich, die Schriftfarbe einer TTabSheet-Registerkarte zu ändern?
- 4. Ist es möglich, eine Sperre in PostgreSQL automatisch zu lösen?
- 5. Ist es möglich, eine Zeichenkette in C zu ändern?
- 6. Erlangung der Zertifikatskette
- 7. ttk.Combobox: Ist es möglich, die Schriftart einzelner Artikel zu ändern?
- 8. Ist es möglich, die Ausrichtung eines UISearchBar-Platzhalters zu ändern?
- 9. Ist es für einen Kunden möglich, die Zahlungsmethode zu ändern?
- 10. Ist es möglich, Flags auf einer vorhandenen RegExp zu ändern?
- 11. Ist es möglich, die Hintergrundfarbe eines CMFCEditBrowseCtrl-Steuerelements zu ändern?
- 12. Ist es möglich, die Verzeichnisstruktur von Yeoman zu ändern?
- 13. Ist es möglich, C++ - Code zu symbolisieren?
- 14. System.Web.UI.WebControls.Calendar ist es möglich, die Farbe einzelner Auswahlen zu ändern?
- 15. Ist es möglich, die Aktionsbalken-Registerkarte programmgesteuert zu ändern?
- 16. Ist es möglich, die erste Abbruchbedingung in BGL zu ändern?
- 17. Ist es möglich, die Breite des Zählers zu ändern?
- 18. Jmeter-Ist es möglich, die Verarbeitungsreihenfolge zu ändern
- 19. MakeCert - Ist es möglich, die Schlüsselgröße zu ändern?
- 20. Ist es möglich, die Telefonnummer beim Telefonieren zu ändern?
- 21. Ist es möglich, die Konsolenschriftgröße in IntelliJ IDEA zu ändern
- 22. Ist es möglich, die automatische Formatverknüpfung in Netbeans zu ändern?
- 23. Ist es möglich, die Ausrichtung der Textausrichtung auf einer Schaltfläche mithilfe von vba zu ändern?
- 24. Ist es möglich, die Eigenschaften einer WebReference in der Laufzeit zu ändern?
- 25. Ist es möglich, die Bildlaufleiste auf der linken Seite einer Listenansicht zu ändern?
- 26. Ist es möglich, die Verwendung einer using-Anweisung in C#
- 27. Ist es möglich, .so Datei zu bearbeiten/zu ändern?
- 28. Ist es möglich, Signal innerhalb einer C++ - Klasse zu verwenden?
- 29. Wenn zwei CCMenuItem sich gegenseitig überlappen, ist es möglich, eine Priorität gegenüber der anderen zu haben?
- 30. Ist es möglich, HttpBrowserCapabilities aus einer C# -Konsolenanwendung zu verwenden?
Einfach nur neugierig, gibt es keinen Grund dies nicht IDisposable verwenden könnte? – wwahammy
@wahahammy Es gibt keinen Grund, nein. – Servy