我正在寻找一种在IO/Kit中工作的等待/信号同步原语,它的使用方式如下:
线程1:wait(myEvent) // 阻塞线程1
线程2:wait(myEvent) // 阻塞线程2
线程3:signal(myEvent) // 释放线程1或线程2中的一个
这不能使用IOLock来实现,因为加锁/解锁操作将由不同的线程进行,根据我读到的一些文档,这是一个不好的想法。
线程1、2、3可以是用户线程或内核线程。
我也想在等待操作中添加可选的超时。
感谢您的帮助!
我正在寻找一种在IO/Kit中工作的等待/信号同步原语,它的使用方式如下:
线程1:wait(myEvent) // 阻塞线程1
线程2:wait(myEvent) // 阻塞线程2
线程3:signal(myEvent) // 释放线程1或线程2中的一个
这不能使用IOLock来实现,因为加锁/解锁操作将由不同的线程进行,根据我读到的一些文档,这是一个不好的想法。
线程1、2、3可以是用户线程或内核线程。
我也想在等待操作中添加可选的超时。
感谢您的帮助!
您想使用位于<IOKit/IOLocks.h>
中声明的函数IOLockSleepDeadline()
。
在开始之前,您需要使用IOLockAlloc()
设置一个单独的IOLock
。然后,线程1和2使用IOLockLock()
锁定IOLock,并立即通过调用IOLockSleepDeadline()
释放锁并进入睡眠状态。当第3个线程准备好后,它将调用IOLockWakeup()
(如果您只想唤醒单个线程,则为oneThread = true
)。这会导致线程1或2被唤醒并立即获取锁(因此它们需要解锁或再次休眠)。
IOLockSleep()
的工作方式类似,但没有超时。
如果您的驱动程序已经集中在IOWorkLoop
上,则可以使用IOCommandGate的commandSleep()方法来执行类似操作可能更合适。
IOLocks::IOLockLock
方法的文档如下所述:
锁定互斥锁。如果任何线程持有锁,则阻塞等待其解锁。此函数可能会阻塞,因此不应在中断级别或持有自旋锁时调用。从一个线程递归锁定互斥锁将导致死锁。
因此,它肯定会阻塞其他线程(T1 和 T2),直到持有锁的线程释放它(T3)。它似乎不支持的一件事是超时。