Frage

Ich suche eine Wartungs-/Signal -Synchronisation -Primitive in IO/Kit wie:

Thread1: Warten Sie (Myevent) // Blockieren von Thread1

Thread2: Warten Sie (Myevent) // Blockierung von Thread2

Thread3: Signal (Myevent) // Lösen Sie einen von Thread1 oder Thread2

Dies kann nicht mit einem IOLock erfolgen, da die Sperren-/Entsperrvorgänge aus verschiedenen Threads erfolgen würden, was laut einem Dokument, den ich gelesen habe, eine schlechte Idee ist.

Thread1, 2, 3 können Benutzer -Threads oder Kernel -Threads sein.

Ich möchte auch eine optionale Auszeit mit dem Wartevorgang haben.

Danke für Ihre Hilfe !

War es hilfreich?

Lösung

Sie wollen die Funktion IOLockSleepDeadline(), deklariert in <IOKit/IOLocks.h>.

Sie haben eine Single eingerichtet IOLock Irgendwo mit IOLockAlloc() Bevor Sie beginnen. Dann sperren Fäden 1 und 2 das iolock mit IOLockLock() und sofort das Schloss aufgeben und schlafen gehen, indem Sie anrufen IOLockSleepDeadline(). Wenn Thread 3 fertig ist, ruft er auf IOLockWakeup() (mit oneThread = true Wenn Sie nur einen einzelnen Thread wecken möchten). Dies führt dazu, dass Faden 1 oder 2 aufwachen und sofort das Schloss erwerben (damit sie wieder entsperren oder schlafen müssen).

IOLockSleep() Funktioniert ähnlich, aber ohne die Auszeit.

Sie können etwas Ähnliches verwenden Die Methode des Iocommandgates Commandsleep () Dies kann angemessener sein, wenn Ihr Fahrer bereits um eine zentriert ist IOWorkLoop.

Andere Tipps

Die Dokumentation der Methode IOLocks::IOLockLock stellt Folgendes fest:

Sperren Sie den Mutex. Wenn das Schloss von einem Faden gehalten wird, blockieren Sie auf die Entsperren. Diese Funktion kann blockieren und sollte daher nicht von der Interrupt -Ebene aufgerufen werden oder während ein Spinschloss gehalten werden. Das Verschließen des Mutex aus einem Thread führt zu einer Deadlock.

Es wird also sicherlich die anderen Fäden (T1 und T2) blockieren, bis der Gewinde, der das Sperren hält, sie freisetzt (T3). Eine Sache, die es nicht zu unterstützen scheint, ist die Auszeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top