Вопрос

Я ищу синхронизацию ожидания/сигнала примитива в 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). Одна вещь, которую он, кажется, не поддерживает, это тайм -аут.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top