Events 带有IO/Kit的同步原语
我正在IO/Kit中寻找一个等待/信号同步原语,其工作方式如下: Thread1:wait(myEvent)//阻止Thread1 Thread2:wait(myEvent)//阻止Thread2 Thread3:signal(myEvent)//释放thread1或thread2中的一个 这不能用IOLock来完成,因为锁定/解锁操作将由不同的线程执行,根据我读过的一些文档,这是一个坏主意 线程1、2、3可以是用户线程或内核线程 我还希望有一个可选的等待操作超时Events 带有IO/Kit的同步原语,events,synchronization,iokit,Events,Synchronization,Iokit,我正在IO/Kit中寻找一个等待/信号同步原语,其工作方式如下: Thread1:wait(myEvent)//阻止Thread1 Thread2:wait(myEvent)//阻止Thread2 Thread3:signal(myEvent)//释放thread1或thread2中的一个 这不能用IOLock来完成,因为锁定/解锁操作将由不同的线程执行,根据我读过的一些文档,这是一个坏主意 线程1、2、3可以是用户线程或内核线程 我还希望有一个可选的等待操作超时 谢谢你的帮助 方法的文件说明如
谢谢你的帮助 方法的文件说明如下: 锁定互斥锁。如果锁由任何线程持有,则阻塞等待 解锁。此函数可能会阻塞,因此不应从中调用 保持旋转锁时的中断级别或时间。锁定互斥锁 从一个线程递归执行将导致死锁
因此它肯定会阻塞其他线程(T1和T2),直到持有锁的线程释放它(T3)。它似乎不支持的一件事是超时。您需要函数
iolockleepdataline()
,在
中声明
在开始之前,可以使用IOLockAlloc()
在某处设置一个IOLock
。然后,线程1和2使用IOLockLock()
锁定IOLock,并通过调用iolockleepdataline()
立即放弃锁定并进入睡眠状态。当线程3准备就绪时,它调用IOLockWakeup()
(如果您只想唤醒单个线程,则使用oneThread=true
)。这会导致线程1或2醒来并立即获得锁(因此它们需要再次解锁或休眠)
iolockleep()
的工作原理类似,但没有超时
如果您的驱动程序已经以IOWorkLoop
为中心,则可以使用类似的方法来执行操作,这可能更合适