我正在寻找IO/套件中的等待/信号同步原始功能:

线程1:等待(myevent)//阻止线程1

thread2:等待(myevent)//阻止线程2

thread3:信号(myevent)//释放thread1或thread2之一

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

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

我也想在等待操作时有一个可选的时间。

谢谢你的帮助 !

有帮助吗?

解决方案

您想要功能 IOLockSleepDeadline(), ,宣布 <IOKit/IOLocks.h>.

您设置了一个 IOLock 在某个地方 IOLockAlloc() 在你开始之前。然后,线1和2用 IOLockLock() 立即放弃锁,打电话入睡 IOLockSleepDeadline(). 。当线程3准备就绪时,它会调用 IOLockWakeup() (和 oneThread = true 如果您只想唤醒一个线程)。这会导致螺纹1或2醒来并立即获取锁(因此他们需要解锁或再次睡觉)。

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

您可以使用类似的事情 iocommandgate的命令leep()方法 如果您的驾驶员已经围绕一个 IOWorkLoop.

其他提示

方法的文档 IOLocks::IOLockLock 指出以下内容:

锁定互斥。如果锁定锁定的任何线程,则等待其解锁。此功能可能会阻止,因此不应从中断级别或旋转锁定时调用。从一个线程中递归锁定Mutex将导致死锁。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top