2011-10-18 47 views
3

我正在寻找一个等待/信号同步的IO原始/包的工作,如:同步原语IO /包

线程1:等待(myEvent)//阻塞线程1

线程2:等待(myEvent )//阻塞线程2

Thread3:信号(myEvent)//释放的线程1的一个或线程2

这不能使用IOLOCK因为所做的锁定/解锁操作将来自不同线程的,制成其根据我读过的一些文档,这是一个糟糕的主意。

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

我还希望有一个可选的超时等待操作。

感谢您的帮助!

回答

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为中心,那么这可能更合适。

+0

就是这样! – Julien

0

方法的文档IOLocks::IOLockLock规定如下:

锁定互斥。如果锁被任何线程占用,阻塞等待 其解锁。此功能可能会阻止,因此不应该从 中断级别或自旋锁保持时被调用。从一个线程递归锁定互斥锁 将导致死锁。

因此,它肯定会阻塞其他线程(T1和T2),直到持有锁的线程释放它(T3)。它似乎不支持的一件事是暂停。