[英]choosing between process and thread, and inter-process(thread) communication
我想編寫一個簡單的UDP服務器程序,使用recvfrom()接收每個接收到的數據包的數據包,該程序將對其進行處理,我的原始源代碼如下:
for(;;){
n = recvfrom(sockfd, mesg, 10000, 0 ptr_sockaddr, &len);
process(mesg);
}
但是以這種方式,如果process()
函數花費的時間較長,則會影響recvfrom()
。 所以我需要創建一個新的進程或新線程,
mesg
傳遞給新進程(或線程)。 如果數據包的接收比處理快得多,我應該使用哪種緩沖方法? 如果可以提供一些源代碼片段,那更好!
謝謝!
我建議使用一個圍繞recvfrom
循環的線程。 收到數據報后,將其放在隊列中。 然后,您可以擁有一個線程池,該線程池從隊列中提取數據報並對其進行處理。
通常的解決方案是具有互斥量和保護隊列的條件變量。 將項目添加到隊列的工作原理如下:
獲取互斥鎖。
將項目添加到隊列。
發信號通知條件變量。
釋放互斥鎖。
池中的線程執行此操作:
獲取互斥鎖。
如果隊列中有項目,請跳到步驟5。
阻止條件變量以釋放互斥量。
轉到步驟2。
從隊列中刪除該項目。
釋放互斥鎖。
處理我們從隊列中刪除的項目。
轉到步驟1。
您可能希望阻止隊列無限期增長。 總是有可能您收到的數據報的處理速度可能比處理它們快,並且允許隊列的內存使用量保持增長並不是一個好主意。
使用線程更為簡單,因為線程可以看到其父進程的內存。 因此它可以訪問變量和內存,讀取並更改它們。
使用進程將不允許您直接以書面方式訪問父進程的內存,而必須使用其他方式來更改變量和父進程的內存,例如共享內存(mmap)
聲明一些結構以包含數據。 Malloc一個。 閱讀消息。 將* struct排隊,然后立即對另一個消息進行malloc(或depool)處理。 在使用者中處理之后,釋放或回收* struct。
您可以通過以下任一方式進行流量控制:
1)使用有界阻塞隊列,在處理后在使用者端釋放* struct。
2)使用兩個無限制的阻塞隊列-一個用* struct預先填充以充當池,另一個用線程之間進行通信。 當recvFrom線程需要* struct時,將其從池中彈出。 使用者處理完* struct后,將其推回池中。
如果process()函數沒有向父級返回任何內容,則為每條消息創建一個進程要容易得多。 您需要做的就是添加if(fork()<= 0)return; 在process()的開始,您不必擔心會覆蓋mesg和ptr_sockaddr。
處理。 然后,編程錯誤將破壞單個連接,而不是整個服務器。
為了進行通信,您可以在父進程與所有子進程之間的fork()之前建立共享內存區域並進行同步。 使用互斥/信號量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.