我很抱歉這個問題的基本性,但我在這裏遇到問題。我有一個客戶端服務器程序。我不知道有多少連接會來,但他們不是無限的。最後,在關閉所有連接後,會輸出一些結果。但是我遇到的問題是,接受連接處於無限循環中,它如何停止輸出結果。暫停客戶服務器程序
感謝
我很抱歉這個問題的基本性,但我在這裏遇到問題。我有一個客戶端服務器程序。我不知道有多少連接會來,但他們不是無限的。最後,在關閉所有連接後,會輸出一些結果。但是我遇到的問題是,接受連接處於無限循環中,它如何停止輸出結果。暫停客戶服務器程序
感謝
你需要有某種形式的條件下,打破了你的循環,你的情況,超時可能會做工最好,基本意思是,如果你沒有得到的X任意新客戶秒,你停止尋找客戶,同樣的任何連接錯誤。
還有什麼需要看你使用的代碼。
正在考慮超時...謝謝 – 2012-02-10 16:48:18
處理EINTR
從accept(2)
錯誤與終止程序和擊中^C
通常工作。
你可以安裝在SIGTERM
信號,會設置一個全局變量volatile sig_atomic_t
一個處理程序,並測試該變量在復路(大概在poll
或select
)。請記住,signal處理程序不能調用許多功能(只有異步信號安全的那些)。
大多數Linux或Posix服務器預計會很好地捕捉到SIGTERM
。
你可以考慮使用一個事件處理庫一樣libev
,libevent
等
雖然我的背景是與Windows NT函數「名」是那些通用名稱或線程處理功能應該在任何多可用線程環境。
如果主線程可以確定問題的子線程何時應該終止,那麼可以通過讓子線程循環布爾類型來執行此操作(例如「terminate_conditon」),或者通過終止線程來處理線程。
// child thread
terminate_condition=FALSE;
while (!terminate_condition)
{
// accept connections
}
child_thread_done=TRUE;
// output results
exit_thread();
// main thread
child_thread_done=FALSE;
child_thread=create_thread (...);
// monitor connections to determine when done
terminate_condition=TRUE;
while (!child_thread_done)
{
sleep (1);
}
// or maybe output results here?
exit_process();
這種受控終端解決方案要求只有一個線程寫入child_thread_done布爾和任何其他線程只讀取。
或者
// child thread
while (1)
{
// accept connections
}
// main thread
child_thread=create_thread (...);
// monitor connections to determine when done
kill_thread (child_thread);
// output results
exit_process();
第二種形式是混亂,因爲它只是殺子線程。一般情況下,最好讓子線程執行受控終止,尤其是在分配了資源的情況下(它們成爲整個流程的責任而不僅僅是分配線程)。
如果有很多使用連接的子線程,則需要一個同步終止機制:或者是具有與子線程一樣多的成員的結構(終止線程將其「終止」布爾值設置爲true,終止並且主線程監視結構以確保在繼續之前所有子節點「已終止」的布爾值都爲真)或者包含子線程數量的計數器(當子節點即將終止時,它將通過自旋鎖對計數器進行獨佔控制,使其減少並釋放終止之前的鎖定:在計數器包含零之前,主線程不執行任何操作)。
你可以發佈while循環的代碼嗎? – Brian 2012-02-10 16:19:39