我正在寻找IO / Kit中的等待/信号同步原语,如:
Thread1:wait(myEvent)//阻塞thread1
Thread2:wait(myEvent)//阻塞thread2
Thread3:signal(myEvent)//释放thread1或thread2
之一使用IOLock无法做到这一点,因为锁定/解锁操作将来自不同的线程,根据我读过的一些文档,这是一个坏主意。
Thread1,2,3可以是用户线程或内核线程。
我也希望在等待操作中有一个可选的超时时间。
感谢您的帮助!
答案 0 :(得分:2)
您需要IOLockSleepDeadline()
中声明的函数<IOKit/IOLocks.h>
。
在开始之前,您使用IOLock
在某处设置了一个IOLockAlloc()
。然后,线程1和2用IOLockLock()
锁定IOLock并立即放弃锁定并通过调用IOLockSleepDeadline()
进入睡眠状态。当线程3准备就绪时,如果你只想唤醒一个线程,它会调用IOLockWakeup()
(oneThread = true
}。这会导致线程1或2被唤醒并立即获得锁定(因此需要解锁或重新进入睡眠状态)。
IOLockSleep()
的工作方式类似,但没有超时。
您可以使用the IOCommandGate's commandSleep() method执行类似操作,如果您的驱动程序已经以IOWorkLoop
为中心,则可能更合适。
答案 1 :(得分:0)
方法IOLocks::IOLockLock
的文档说明如下:
锁定互斥锁。如果锁被任何线程持有,则阻塞等待 解锁。此功能可能会阻止,因此不应该从中调用 中断级别或保持旋转锁定。锁定互斥锁 从一个线程递归将导致死锁。
所以它肯定会阻塞其他线程(T1和T2),直到持有锁的线程释放它(T3)。它似乎不支持的一件事是超时。