我需要重複發送和接收來自套接字的UDP數據報。我的想法是產生兩個線程,一個負責發送,另一個負責接收。只有一個線程可以同時等待阻塞recv()
而另一個線程在同一個套接字上執行send()
時,整個想法纔有意義。兩個線程可以在同一個套接字上同時發送``和`recv`嗎?
我做了一些谷歌搜索,發現這太問題:Are parallel calls to send/recv on the same socket valid?接受的答案提到send()
和recv()
是線程安全的(嗯...),但隨後以驚人的言論進行:
這不必然意味着他們將並行執行
糟糕。這是否意味着如果我實現了我的多線程思想,是否最終會在發送線程實際開始發送其數據之前等待接收線程的recv()
返回?壞。
正是這種曖昧接受的答案是否僅是指兩個平行send()
的,或者值得關注的是真實的也是企圖平行執行一個send()
和一個recv()
。因此:
並行執行兩個線程在同一個套接字上調用send()
和調用recv()
是否會並行執行,或者這些調用之一是否會阻塞,直到另一個調用返回?
爲什麼不爲其他線程處理的接收數據包設置一個工作隊列?在線程之間共享文件描述符可能是一個壞主意。 – tadman
1.他們可以......買,恕我直言:2.這將是一個糟糕的設計。 3.假設只有一個線程正在讀取,另一個線程正在發送,這可能是一個稍微好一點的設計,但它仍然很差。 4.在'send'或'recv'上阻塞不能有效地使用CPU或程序的時間。 4.您幾乎不需要線程,您可以在一個線程上運行帶有超過10K套接字的整個服務器。 – Myst
@tadman爲什麼這是一個壞主意?問題是數據包必須每隔20ms發送一次,所以我不能等到我發送任何內容之前收到一些東西。我認爲指定一個線程來執行發送操作會使它最容易保持這個20毫秒的時間間隔不受任何不相關的處理開銷的影響 – gaazkam