2012-02-10 67 views
0

我很抱歉這個問題的基本性,但我在這裏遇到問題。我有一個客戶端服務器程序。我不知道有多少連接會來,但他們不是無限的。最後,在關閉所有連接後,會輸出一些結果。但是我遇到的問題是,接受連接處於無限循環中,它如何停止輸出結果。暫停客戶服務器程序

感謝

+4

你可以發佈while循環的代碼嗎? – Brian 2012-02-10 16:19:39

回答

1

你需要有某種形式的條件下,打破了你的循環,你的情況,超時可能會做工最好,基本意思是,如果你沒有得到的X任意新客戶秒,你停止尋找客戶,同樣的任何連接錯誤。

還有什麼需要看你使用的代碼。

+0

正在考慮超時...謝謝 – 2012-02-10 16:48:18

1

處理EINTRaccept(2)錯誤與終止程序和擊中^C通常工作。

0

你可以安裝在SIGTERM信號,會設置一個全局變量volatile sig_atomic_t一個處理程序,並測試該變量在復路(大概在pollselect)。請記住,signal處理程序不能調用許多功能(只有異步信號安全的那些)。

大多數Linux或Posix服務器預計會很好地捕捉到SIGTERM

你可以考慮使用一個事件處理庫一樣libevlibevent

0

雖然我的背景是與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,終止並且主線程監視結構以確保在繼續之前所有子節點「已終止」的布爾值都爲真)或者包含子線程數量的計數器(當子節點即將終止時,它將通過自旋鎖對計數器進行獨佔控制,使其減少並釋放終止之前的鎖定:在計數器包含零之前,主線程不執行任何操作)。