Синхронизация примитив с io/kit
-
25-10-2019 - |
Вопрос
Я ищу синхронизацию ожидания/сигнала примитива в IO/Kit, работающего как:
Thread1: подождите (myevent) // Блокирование потока1
Thread2: подождите (myevent) // Блокирование Thread2
Thread3: сигнал (myevent) // Выпустить один из потоков1 или потока2
Это не может быть сделано, используя IOLock, так как операции блокировки/разблокировки будут сделаны из разных потоков, что является плохой идеей в соответствии с некоторым доктором, который я прочитал.
Thread1, 2, 3 могут быть пользовательскими потоками или потоками ядра.
Я также хотел бы провести дополнительное время с операцией ожидания.
Спасибо за вашу помощь !
Решение
Вы хотите функцию IOLockSleepDeadline()
, объявлен в <IOKit/IOLocks.h>
.
Вы настроили сингл IOLock
где -то с IOLockAlloc()
прежде чем вы начнете. Затем потоки 1 и 2 блокируют iolock с IOLockLock()
и сразу же отмените замок и заснул, позвонив IOLockSleepDeadline()
. Анкет Когда поток 3 готов, он вызывает IOLockWakeup()
(с oneThread = true
Если вы хотите разбудить только один поток). Это заставляет нить 1 или 2 просыпаться и немедленно приобрести замок (поэтому им нужно снова разблокировать или спать).
IOLockSleep()
работает так же, но без тайм -аута.
Вы можете сделать что -то подобное, используя Метод команд Iocommandgate () что может быть более уместным, если ваш водитель уже сосредоточен вокруг IOWorkLoop
.
Другие советы
Документация метода IOLocks::IOLockLock
утверждает следующее:
Заблокируйте мутекс. Если блокировка удерживается любым потоком, блокируйте ожидание его разблокировки. Эта функция может блокировать, и поэтому не следует вызывать с уровня прерываний или пока удерживается спиновая блокировка. Рекурсивное заблокирование из одной потока приведет к тупику.
Таким образом, он, безусловно, будет блокировать другие потоки (T1 и T2), пока нить удерживает блокировку его (T3). Одна вещь, которую он, кажется, не поддерживает, это тайм -аут.