两个线程可以在同一个套接字上同时`send`和`recv`吗?

时间:2017-05-24 19:55:17

标签: linux sockets pthreads posix

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

我做了一些谷歌搜索,发现了这个问题:Are parallel calls to send/recv on the same socket valid?接受的答案提到send()recv()是线程安全的(哇......),但接着是一个惊人的评论:

  

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

糟糕。这是否意味着如果我实现了我的多线程创意,我是否会在发送线程等待接收线程的recv()在实际开始发送数据之前返回?坏。

这个被接受的答案是否仅涉及两个并行的send()是不明确的,或者对于尝试并行执行一个send()和一个recv()的问题,这是不确定的。因此:

两个线程对同一套接字上的send()的调用和recv()的调用是否会被并行执行,或者其中一个调用会阻塞,直到另一个返回?

1 个答案:

答案 0 :(得分:0)

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

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

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