我正在尋找一個等待/信號同步的IO原始/包的工作,如:同步原語IO /包
線程1:等待(myEvent)//阻塞線程1
線程2:等待(myEvent )//阻塞線程2
Thread3:信號(myEvent)//釋放的線程1的一個或線程2
這不能使用IOLOCK因爲所做的鎖定/解鎖操作將來自不同線程的,製成其根據我讀過的一些文檔,這是一個糟糕的主意。
線程1,2,3可以是用戶線程或內核線程。
我還希望有一個可選的超時等待操作。
感謝您的幫助!
我正在尋找一個等待/信號同步的IO原始/包的工作,如:同步原語IO /包
線程1:等待(myEvent)//阻塞線程1
線程2:等待(myEvent )//阻塞線程2
Thread3:信號(myEvent)//釋放的線程1的一個或線程2
這不能使用IOLOCK因爲所做的鎖定/解鎖操作將來自不同線程的,製成其根據我讀過的一些文檔,這是一個糟糕的主意。
線程1,2,3可以是用戶線程或內核線程。
我還希望有一個可選的超時等待操作。
感謝您的幫助!
您想要的功能IOLockSleepDeadline()
,在<IOKit/IOLocks.h>
中聲明。
在開始之前,您在某處設置了一個IOLock
,其中有IOLockAlloc()
。然後,線程1和2通過IOLockLock()
鎖定IOLock並立即放棄鎖定並通過呼叫IOLockSleepDeadline()
進入睡眠狀態。當線程3準備就緒時,它調用IOLockWakeup()
(如果您只想喚醒單個線程,則使用oneThread = true
)。這會導致線程1或2被喚醒並立即獲取鎖(因此它們需要解鎖或再次進入睡眠狀態)。
IOLockSleep()
工作原理類似,但沒有超時。
您可以使用the IOCommandGate's commandSleep() method做類似的事情,如果您的驅動程序已經以IOWorkLoop
爲中心,那麼這可能更合適。
方法的文檔IOLocks::IOLockLock
規定如下:
鎖定互斥。如果鎖被任何線程佔用,阻塞等待 其解鎖。此功能可能會阻止,因此不應該從 中斷級別或自旋鎖保持時被調用。從一個線程遞歸鎖定互斥鎖 將導致死鎖。
因此,它肯定會阻塞其他線程(T1和T2),直到持有鎖的線程釋放它(T3)。它似乎不支持的一件事是暫停。
就是這樣! – Julien