IO/Kit同步原语

3

我正在寻找一种在IO/Kit中工作的等待/信号同步原语,它的使用方式如下:

线程1:wait(myEvent) // 阻塞线程1

线程2:wait(myEvent) // 阻塞线程2

线程3:signal(myEvent) // 释放线程1或线程2中的一个

这不能使用IOLock来实现,因为加锁/解锁操作将由不同的线程进行,根据我读到的一些文档,这是一个不好的想法。

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

我也想在等待操作中添加可选的超时。

感谢您的帮助!

2个回答

3

您想使用位于<IOKit/IOLocks.h>中声明的函数IOLockSleepDeadline()

在开始之前,您需要使用IOLockAlloc()设置一个单独的IOLock。然后,线程1和2使用IOLockLock()锁定IOLock,并立即通过调用IOLockSleepDeadline()释放锁并进入睡眠状态。当第3个线程准备好后,它将调用IOLockWakeup()(如果您只想唤醒单个线程,则为oneThread = true)。这会导致线程1或2被唤醒并立即获取锁(因此它们需要解锁或再次休眠)。

IOLockSleep()的工作方式类似,但没有超时。

如果您的驱动程序已经集中在IOWorkLoop上,则可以使用IOCommandGate的commandSleep()方法来执行类似操作可能更合适。


0

IOLocks::IOLockLock 方法的文档如下所述:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接