2010-01-08 124 views
3

GCC 4.4.1異步編程

我寫一個服務器程序有許多客戶端將連接到客戶端和服務器將管理客戶端請求並管理客戶端的狀態。高負載下的許多客戶端將成爲使用異步編程的決定性因素。然而,我從來沒有在C中做過Async。但是,從我所瞭解的我的研究中,我認爲我需要使用Async。

1)使用同步編程將意味着呼叫將被阻止並將創建一個瓶頸。系統只會在高負載下崩潰

2)使用使用線程的同步編程會爲每個客戶端創建一個新線程,這意味着在高負載下系統資源可能會用完,並可能使系統處理複雜的處理那些線程。

3)使用異步意味着我將不得不開發一個狀態機?

任何人都可以指向正確的方向嗎?在Aysnc編程?

非常感謝任何建議,

+4

160個問題;不到60%接受... – 2010-01-08 03:00:04

+3

至少他擊敗了這個傢伙 - http://stackoverflow.com/users/68183/mrblah – danben 2010-01-08 03:03:21

+0

答案是:是的,去異步和是的,你需要一個FSM。 – jldupont 2010-01-08 03:06:38

回答

4

把傳入的請求進入隊列

使用一個線程分派隊列從隊列中取出

請求在自己的線程中執行;該隊列可以限制活動線程(線程池)的數量以防止服務器過載。請求不會丟失,但它們可能會在隊列中等待處理一段時間。

隊列管理器也可以殺死那些太長的線程,如果你喜歡

好運!

+0

你好。感謝您的回答。隊列將以鏈表的形式出現。調度員會從隊列中獲取請求嗎?非常感謝。 – ant2009 2010-01-08 17:21:47

+1

@ [robUK]:不管你喜歡,你都可以實現隊列,是的,調度器從隊列中提取請求並在他們自己的線程中處理它們 – 2010-01-09 16:57:55

1

有很多方法可以解決這個問題。

您可以編寫一個程序來監視一個端口,並在收到請求時產生一個線程。

您可以編寫單線程程序並使用inetd將其設置爲給定端口的處理程序。只要客戶端連接,程序的一個實例就會啓動。

你可以使用狀態機,隊列,事件驅動模型,各種各樣的東西。

說真的,你需要閱讀一些關於網絡編程的書籍。直到你明白你在做什麼,你纔會努力產生有用的東西。