题
我正在寻找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)。它似乎不支持的一件事是超时。
不隶属于 StackOverflow