2017-05-24 101 views
2

我需要重複發送和接收來自套接字的UDP數據報。我的想法是產生兩個線程,一個負責發送,另一個負責接收。只有一個線程可以同時等待阻塞recv()而另一個線程在同一個套接字上執行send()時,整個想法纔有意義。兩個線程可以在同一個套接字上同時發送``和`recv`嗎?

我做了一些谷歌搜索,發現這太問題:Are parallel calls to send/recv on the same socket valid?接受的答案提到send()recv()是線程安全的(嗯...),但隨後以驚人的言論進行:

這不必然意味着他們將並行執行

糟糕。這是否意味着如果我實現了我的多線程思想,是否最終會在發送線程實際開始發送其數據之前等待接收線程的recv()返回?壞。

正是這種曖昧接受的答案是否僅是指兩個平行send()的,或者值得關注的是真實的也是企圖平行執行一個send()和一個recv()。因此:

並行執行兩個線程在同一個套接字上調用send()和調用recv()是否會並行執行,或者這些調用之一是否會阻塞,直到另一個調用返回?

+0

爲什麼不爲其他線程處理的接收數據包設置一個工作隊列?在線程之間共享文件描述符可能是一個壞主意。 – tadman

+2

1.他們可以......買,恕我直言:2.這將是一個糟糕的設計。 3.假設只有一個線程正在讀取,另一個線程正在發送,這可能是一個稍微好一點的設計,但它仍然很差。 4.在'send'或'recv'上阻塞不能有效地使用CPU或程序的時間。 4.您幾乎不需要線程,您可以在一個線程上運行帶有超過10K套接字的整個服務器。 – Myst

+0

@tadman爲什麼這是一個壞主意?問題是數據包必須每隔20ms發送一次,所以我不能等到我發送任何內容之前收到一些東西。我認爲指定一個線程來執行發送操作會使它最容易保持這個20毫秒的時間間隔不受任何不相關的處理開銷的影響 – gaazkam

回答

0

簡短的回答:您應該可以有單獨的線程發送和接收相同的套接字句柄。

一個常見的場景是視頻會議應用程序。您可能希望從麥克風錄製一個線索並將音頻從udp端口發出。另一個線程在同一端口上接收數據包並通過揚聲器播放它們。如果你的協議更加同步(即請求/響應流 - 爲了發送,你首先必須先接收某些東西),那麼從設計的角度來看,單個可能的線程更有意義。

相關問題