Question

Je cherche une attente / synchronisation de signal primitive dans IO / Kit de travail comme:

Thread1: wait (myEvent) // Blocage thread1

Thread2: wait (myEvent) // Blocage thread2

Thread3: signal (myEvent) // sortie d'un des thread1 ou thread2

Cela ne peut pas être fait à l'aide d'un IOLOCK depuis seraient les opérations de verrouillage / déverrouillage de fils de différentes, ce qui est une mauvaise idée selon certains doc, je l'ai lu.

Thread1, 2, 3 peuvent être des fils de l'utilisateur ou les fils du noyau.

Je voudrais aussi avoir un temps en option avec l'opération d'attente.

Merci pour votre aide!

Était-ce utile?

La solution

Vous voulez que la fonction IOLockSleepDeadline(), a déclaré dans <IOKit/IOLocks.h>.

Vous mettez en place un seul endroit de IOLock avec IOLockAlloc() avant de commencer. Ensuite, les fils 1 et 2 verrouiller le IOLOCK avec IOLockLock() et quitter immédiatement le verrou et aller dormir en appelant IOLockSleepDeadline(). Quand le fil 3 est prêt, il appelle IOLockWakeup() (avec oneThread = true si vous voulez seulement de se réveiller un seul fil). Cela provoque un fil 1 ou 2 de se réveiller et d'acquérir immédiatement le verrou (donc ils ont besoin pour déverrouiller ou encore le sommeil).

IOLockSleep() fonctionne de façon similaire, mais sans le délai d'attente.

Vous pouvez faire quelque chose de similaire en utilisant commandSleep () du IOCommandGate de qui peut être plus approprié si votre pilote est déjà centré autour un IOWorkLoop.

Autres conseils

La documentation de la méthode IOLocks::IOLockLock stipule ce qui suit:

Verrouiller le mutex. Si le verrou est maintenu par un fil, pour bloquer en attente son déverrouillage. Cette fonction peut bloquer et ne devrait donc pas être appelé à partir niveau d'interruption ou pendant un verrou de rotation est maintenue. Le verrouillage du mutex récursive d'un fil entraînera dans une impasse.

Ainsi, il sera certainement pas bloquer les autres fils (T1 et T2) jusqu'à ce que le fil en maintenant les sorties verrouiller (T3). Une chose qu'il ne semble pas le soutien est le délai d'attente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top