Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 带有IO/Kit的同步原语_Events_Synchronization_Iokit - Fatal编程技术网

Events 带有IO/Kit的同步原语

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可以是用户线程或内核线程 我还希望有一个可选的等待操作超时 谢谢你的帮助 方法的文件说明如

我正在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
为中心,则可以使用类似的方法来执行操作,这可能更合适