2013-09-25 91 views
0

您好,我在找到以下問題的答案時遇到問題。我試圖在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。

因此將在富()工作的信號()根據需要?如果沒有,我必須把它放在鎖中嗎?如果沒有,還有其他方法可以解決這個問題嗎?

對不起,您的回覆文字牆和感謝。

+0

除非這是某種我不能理解的超級智能設計,否則我認爲你已經使用了'condition variables''非常錯誤。請閱讀https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables – HAL

+0

我沒有看到任何問題,謹慎詳細說明? – TheIronChef

回答

0

對於驅動函數foo()首先調用Signal(cond)而不鎖定cond是否可以?

調用pthread_cond_broadcast()pthread_cond_signal()而不是持有互斥鎖是罰款和portable

的調用pthread_cond_broadcast()或調用pthread_cond_signal()函數可以由一個線程是當前是否擁有互斥體被稱爲是調用pthread_cond_wait()或pthread_cond_timedwait()的線程在等待期間與條件變量相關聯;然而,如果需要可預測的調度行爲,則該線程應該被調用pthread_cond_broadcast()或pthread_cond_signal()的線程鎖定。


我明白了修改鎖定的 'emergency_shutdown' 變量之外的後果。他們並不擔心我太多。

至少使用原子操作來獲取/設置的emergency_shutdown值,如果你不想要保護是一個互斥體,原子能不會阻止你的線程。

+0

當我發佈這個問題後,我意識到我也可以使用trylock! – TheIronChef

相關問題