2011-10-18 46 views
3

我正在尋找一個等待/信號同步的IO原始/包的工作,如:同步原語IO /包

線程1:等待(myEvent)//阻塞線程1

線程2:等待(myEvent )//阻塞線程2

Thread3:信號(myEvent)//釋放的線程1的一個或線程2

這不能使用IOLOCK因爲所做的鎖定/解鎖操作將來自不同線程的,製成其根據我讀過的一些文檔,這是一個糟糕的主意。

線程1,2,3可以是用戶線程或內核線程。

我還希望有一個可選的超時等待操作。

感謝您的幫助!

回答

2

您想要的功能IOLockSleepDeadline(),在<IOKit/IOLocks.h>中聲明。

在開始之前,您在某處設置了一個IOLock,其中有IOLockAlloc()。然後,線程1和2通過IOLockLock()鎖定IOLock並立即放棄鎖定並通過呼叫IOLockSleepDeadline()進入睡眠狀態。當線程3準備就緒時,它調用IOLockWakeup()(如果您只想喚醒單個線程,則使用oneThread = true)。這會導致線程1或2被喚醒並立即獲取鎖(因此它們需要解鎖或再次進入睡眠狀態)。

IOLockSleep()工作原理類似,但沒有超時。

您可以使用the IOCommandGate's commandSleep() method做類似的事情,如果您的驅動程序已經以IOWorkLoop爲中心,那麼這可能更合適。

+0

就是這樣! – Julien

0

方法的文檔IOLocks::IOLockLock規定如下:

鎖定互斥。如果鎖被任何線程佔用,阻塞等待 其解鎖。此功能可能會阻止,因此不應該從 中斷級別或自旋鎖保持時被調用。從一個線程遞歸鎖定互斥鎖 將導致死鎖。

因此,它肯定會阻塞其他線程(T1和T2),直到持有鎖的線程釋放它(T3)。它似乎不支持的一件事是暫停。