socket跨线程使用

来源:10-12 心跳包构建与消费调度-2

慕婉清7375043

2019-10-17

socket可以跨线程使用吗?比如主线程用来读socket接收数据,另外一线程用来写socket发送数据;如果可以,一般什么情况下把socket的读和写放在不同的线程里进行处理!如果将socket的读和写放在一个线程进行操作可能引发的问题有哪些?

写回答

1回答

Qiujuer

2019-10-22

Socket是线程安全的,输入输出流是数据交叉的非线程安全的。
你可以把一个Socket的输入流交给一个线程,输出流交给另外一个线程这是可以的,咱们的课程也有这个demo的哦。就是同时可以实现发送和接收这是OK的。

但是你不能把输出流同时丢给两个及其以上的线程,这会导致数据错乱的问题,比如A线程发送了一部分数据,B又发送,结果总数据就是:
ABABCA, 而接收方接收到的也是这样的数据就无法解析为:AAA BB C.

同理你页不能把收入流同时丢给2个及其以上的线程,比如现在网络中有一段有意义的数据:
123456

现在3个线程同时去去读,则A可能读取到:126,B可能读取到:3,C可能读取到:5.
对于A、B、C三个线程来说各自读取的数据都是无意义的脏数据了。

而你说的读取和写都放一个线程那是没啥问题的,唯一的问题就是如果读取阻塞了,此时想要输出数据就不能立即输出。就是会相互阻塞,不能做到双工,只能交替进行。

0
0

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程