您好,我在找到以下問題的答案時遇到問題。我試圖在Linux上實現一個應用層驅動程序,該驅動程序執行一些IO,但需要有一些非阻塞接口函數。從本質上講,會有永遠只能是在這種環境中兩個線程,線程A和B.我可以在關鍵鎖之外使用pthread信號嗎
請看下面的例子:
Class Driver
{
void foo()
{
emergency_shutdown = true;
Signal(cond)
}
void thread_loop()
{
Lock(cond)
while (true)
{
if (emergency_shutdown)
{
// Do an atomic IO Operation #1 that could take 5ms
// For example: Send an emergency shutdown packet
emergency_shutdown = false;
}
else
{
// do an atomic IO Operation #2 that could take 100ms
}
Signal(cond)
CondWait(cond, 1000); // 1 second wait.
}
Unlock(cond)
}
}
Class HigherLayer
{
...
powerfail_handler() // Function only has 20ms to run before power is lost
{
// POWER FAIL DETECTED!
// Do some important stuff
Driver::foo() // Force shutdown of device
// Do some other important stuff
// ... Power eventually lost but hopefully we did all the
// important stuff in this function.
}
...
}
在上面的例子..線程A基本上這是運行驅動程序線程'thread_loop()'和線程B是HigherLayer線程,它會執行一大堆東西,並在檢測到powerfail時調用powerfail_handler。
主要問題是這樣的: 驅動程序函數foo()首先調用Signal(cond)而不鎖定cond可以嗎?我不想鎖定cond的原因是因爲我不想要powerfail_handler會調用foo()的任何可能的情況,並且它必須圍繞100ms等待鎖釋放。
我明白了修改鎖定的「emergency_shutdown」變量之外的後果。他們並不擔心我太多。
我也明白,如果在100ms窗口中調用foo()時,線程A正在完成IO操作#2,那麼我所期望的IO操作#1不會發生(因爲電源將會在有機會這樣做之前就已經失去了)。這也沒關係,我沒有辦法解決這個問題,只能忍受它,但在這種情況下,我不想被阻擋在foo()上,並錯過了在線程B中執行'其他重要的東西'這就是爲什麼我沒有在foo()中鎖定)。
我只是想確保,如果線程A正在等待(這應該是這樣90%的時間),我想,以表示它是不再等待,做IO操作#1。
因此將在富()工作的信號()根據需要?如果沒有,我必須把它放在鎖中嗎?如果沒有,還有其他方法可以解決這個問題嗎?
對不起,您的回覆文字牆和感謝。
除非這是某種我不能理解的超級智能設計,否則我認爲你已經使用了'condition variables''非常錯誤。請閱讀https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables – HAL
我沒有看到任何問題,謹慎詳細說明? – TheIronChef