带IO / Kit的同步原语

时间:2011-10-18 10:40:07

标签: events synchronization iokit

我正在寻找IO / Kit中的等待/信号同步原语,如:

Thread1:wait(myEvent)//阻塞thread1

Thread2:wait(myEvent)//阻塞thread2

Thread3:signal(myEvent)//释放thread1或thread2

之一

使用IOLock无法做到这一点,因为锁定/解锁操作将来自不同的线程,根据我读过的一些文档,这是一个坏主意。

Thread1,2,3可以是用户线程或内核线程。

我也希望在等待操作中有一个可选的超时时间。

感谢您的帮助!

2 个答案:

答案 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)。它似乎不支持的一件事是超时。