两个线程可以同时在同一套接字上发送和接收吗?

gaa*_*kam 5 sockets linux posix pthreads

我需要反复向套接字发送UDP数据报和从套接字接收UDP数据报。我的想法是产生两个线程,一个负责发送,另一个负责接收。仅当一个线程可以等待一个阻塞recv()而另一个线程可以send()同时在同一套接字上执行时,整个想法才有意义。

我做了一些谷歌搜索,发现了一个SO问题:在同一套接字上对send / recv的并行调用有效吗?接受的答案提到了这一点,send()并且recv()是线程安全的(whew…),但是随后出现一个令人震惊的提示:

这并不一定意味着它们将并行执行

哎呀。这是否意味着如果实现我的多线程想法,我将在发送线程recv()真正开始发送数据之前最终让发送线程等待接收线程返回吗?坏。

这个接受的答案是仅指两个并行send()的,还是对于并行执行一个send()和一个的尝试也很现实,这是模棱两可的recv()。因此:

两个线程在同一套接字上的调用send()和对它的调用recv()是并行执行的,还是这些调用之一阻塞直到另一个返回?

sel*_*bie 4

简短的回答:您应该可以使用相同的套接字句柄使用单独的线程来发送和接收。

一个常见的场景是视频会议应用程序。您可能希望有一个线程从麦克风录音并从 udp 端口​​发送音频。另一个线程在同一端口上接收数据包并通过扬声器播放它们。

如果您的协议更加同步(即请求/响应流 - 为了发送,您首先必须先接收某些内容),那么从设计角度来看,单个可能的线程更有意义。