3

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

Thread1 : wait(myEvent) // 阻塞 thread1

Thread2 : wait(myEvent) // 阻塞 thread2

Thread3 : signal(myEvent) // 释放 thread1 或 thread2 之一

这不能使用 IOLock 来完成,因为锁定/解锁操作将由不同的线程进行,根据我读过的一些文档,这是一个坏主意。

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

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

谢谢你的帮助 !

4

2 回答 2

3

你想要函数IOLockSleepDeadline(),在<IOKit/IOLocks.h>.

在开始之前,您在IOLock某个地方设置了一个单曲。IOLockAlloc()然后,线程 1 和 2 使用 IOLock 锁定IOLockLock()并立即放弃锁定并通过调用IOLockSleepDeadline(). 当线程 3 准备好时,它会调用IOLockWakeup()oneThread = true如果您只想唤醒单个线程)。这会导致线程 1 或 2 唤醒并立即获取锁(因此它们需要再次解锁或休眠)。

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

您可以使用IOCommandGate 的 commandSleep() 方法执行类似的操作,如果您的驱动程序已经以IOWorkLoop.

于 2011-11-01T19:58:57.087 回答
0

方法的文档IOLocks::IOLockLock说明如下:

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

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

于 2011-10-18T13:44:33.930 回答