socket套接字在多线程发送数据时要加锁吗
发布网友
发布时间:2022-05-01 00:54
我来回答
共1个回答
热心网友
时间:2022-06-21 14:08
从socket本身来说不需要加锁,socket套接字在发送数据的时候,需要申请网口的硬中断,硬中断请求在操作系统底层是加锁的,不会出现冲突。
但是从逻辑上来说,如果多线程操作同一个socket,可能会出现发送数据混乱的情况,因为socket执行发送数据的时候,是把你所要发送的数据填入系统的发送缓冲区,真正发送是网口驱动自己执行的。这个填入过程是线程不安全的。
这个不安全不是指会出现临界区冲突,而是指socket并不能保证每次都把完整的数据压入系统发送缓冲区,比方说你一个线程一次发1000个字节,但是可能压一次只压了800个字节进缓冲区,然后另外一个线程压了一部分数据进去,然后才轮到这个线程再把剩下的200个字节压进去。这样你要发送的数据就被打散混乱了。
所以多线程操作一个socket发送数据,最好是用共享一个发送队列的方式,一般很少用直接加锁的。