簡體   English   中英

在進程和線程之間進行選擇,以及進程間(線程)通信

[英]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() 所以我需要創建一個新的進程或新線程,

  1. 在這種情況下哪個更好? 線程或進程? 為什么?
  2. 如何處理進程間或線程間的通信,我的意思是我需要將字符串mesg傳遞給新進程(或線程)。 如果數據包的接收比處理快得多,我應該使用哪種緩沖方法?

如果可以提供一些源代碼片段,那更好!

謝謝!

我建議使用一個圍繞recvfrom循環的線程。 收到數據報后,將其放在隊列中。 然后,您可以擁有一個線程池,該線程池從隊列中提取數據報並對其進行處理。

通常的解決方案是具有互斥量和保護隊列的條件變量。 將項目添加到隊列的工作原理如下:

  1. 獲取互斥鎖。

  2. 將項目添加到隊列。

  3. 發信號通知條件變量。

  4. 釋放互斥鎖。

池中的線程執行此操作:

  1. 獲取互斥鎖。

  2. 如果隊列中有項目,請跳到步驟5。

  3. 阻止條件變量以釋放互斥量。

  4. 轉到步驟2。

  5. 從隊列中刪除該項目。

  6. 釋放互斥鎖。

  7. 處理我們從隊列中刪除的項目。

  8. 轉到步驟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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM