2010-03-09 101 views
2

我有類A和類B和C. 類B運行一個線程,類C運行n個線程。類A應該啓動線程並等待來自用戶的信號(例如Linux中的Ctrl-c) - 類A將停止所有線程(類B和C),做一些最後的工作並且應用程序將退出。關於線程的設計問題

現在的問題是:A類應該如何休眠直到信號收到?什麼是最好的實施?

回答

2

聽起來像條件​​變量的工作。有一個關於如何使用並行線程條件變量的教程here和維基百科here

基本approcah是,所有要定期殺死線程調用那麼pthread_cond_timedwait檢查一個信號已經從A類

發送了另一份

每類B和C的線程會是這個樣子

while (!pthread_cond_timedwait(/*some args (including a timeout)*/) { 
    doSomeSmallUnitOfWork; 
} 

然後在A級的信號處理程序捕獲CTRL-C(或其他信號)

pthread_cont_signal(/*some more args*/); 
+0

從答案中不清楚A級應該如何睡覺,直到收到信號。順便說一句,pthread_cond_signal()不是信號處理程序中要使用的信號安全函數。 – Corwin 2010-03-09 18:49:36

0

做一些關於自旋鎖的研究。這是一個非常基本的併發問題。

也有點寬泛而不知道其他線程正在做什麼。

+0

從問題「類C運行n個線程」。除非OP爲n指定了一個值,否則這個位會使我使用自旋鎖。如果n是一個很大的數字,那麼自旋鎖可能會相當多地競爭。這對性能有着非常不好的影響,因爲所有線程在旋轉時都會消耗CPU週期,並可能導致嘗試完成某些工作的線程中斷。使用某種具有退避機制的自適應旋轉鎖可以緩解這種情況,但並不總是針對每個平臺都實施。 – Glen 2010-03-09 17:46:58

1

您可能想要檢查sigwait。該方法需要一組信號並等待信號到達。