Примитив синхронизации с IO / Kit - PullRequest
3 голосов
/ 18 октября 2011

Я ищу примитив ожидания / синхронизации сигналов в IO / Kit, работающий следующим образом:

Thread1: wait (myEvent) // Блокирующий поток1

Thread2: wait (myEvent) // Blocking thread2

Thread3: signal (myEvent) // Освобождение одного из thread1 или thread2

Это невозможно сделать с помощью IOLock, поскольку операции блокировки / разблокировки будут выполняться из разных потоков, что является плохой идеей в соответствии с некоторыми документами, которые я прочитал.

Thread1, 2, 3 могут быть пользовательскими потоками или потоками ядра.

Я также хотел бы иметь дополнительное времяс операцией ожидания.

Спасибо за вашу помощь!

Ответы [ 2 ]

2 голосов
/ 01 ноября 2011

Требуется функция IOLockSleepDeadline(), объявленная в <IOKit/IOLocks.h>.

Вы установили один IOLock где-то с IOLockAlloc(), прежде чем начать. Затем потоки 1 и 2 блокируют IOLock с помощью IOLockLock(), немедленно снимают блокировку и переходят в режим сна, вызывая IOLockSleepDeadline(). Когда поток 3 готов, он вызывает IOLockWakeup()oneThread = true, если вы хотите разбудить только один поток). Это приводит к тому, что поток 1 или 2 просыпается и немедленно захватывает блокировку (поэтому им нужно снова разблокировать или перевести спать).

IOLockSleep() работает аналогично, но без таймаута.

Вы можете сделать нечто подобное, используя метод commandSleep () IOCommandGate , который может быть более подходящим, если ваш драйвер уже сосредоточен вокруг IOWorkLoop.

0 голосов
/ 18 октября 2011

Документация метода IOLocks::IOLockLock гласит следующее:

Блокировка мьютекса.Если блокировка удерживается каким-либо потоком, блокируйте ожидание ее разблокировки.Эта функция может блокироваться и поэтому не должна вызываться с уровня прерывания или пока удерживается спин-блокировка.Рекурсивная блокировка мьютекса из одного потока приведет к взаимоблокировке.

Таким образом, он обязательно заблокирует другие потоки (T1 и T2), пока поток, удерживающий блокировку, не освободит его (T3).Одна вещь, которую он не поддерживает, это тайм-аут.

...