两个线程对socket 进行读和写,需要加锁吗

同一个 socket,一个线程只读、一个线程只写 → 不需要加锁!

同一个 socket,两个线程都可能读 / 都可能写 → 必须加锁!

我给你用最简单、最直白、Linux 官方规则讲清楚👇


1. 官方 POSIX / Linux 规定(黄金定律)

TCP socket 是全双工的:

  • 读(recv) 和 写(send) 用的是两个独立缓冲区
  • 内核保证:单读 + 单写 = 线程安全

所以:✅ 线程 A:只负责 recv 读数据 ✅ 线程 B:只负责 send 写数据 👉 完全不需要加锁!


2. 什么时候必须加锁?(非常重要)

只要出现下面任意一种,必须加互斥锁:

① 两个线程都在 send(写)

→ 不加锁会导致数据错乱、拼接混乱

② 两个线程都在 recv(读)

→ 不加锁会导致数据被瓜分、丢包、解析失败

③ 读写线程同时 close socket / 重连 / 判断连接状态

cpp

运行

复制代码
m_nConnect != 0
m_ClientSocket < 0

→ 这些共享变量必须加锁!否则会崩溃!

相关推荐
Peregrine917 分钟前
C++ - > 类和对象
java·c++·算法
一条泥憨鱼19 分钟前
【从0开始学习计算机网络】| ARP 协议:地址解析,ARP 欺骗,链路层寻址
网络·后端·学习·计算机网络
2501_9339232523 分钟前
SpringCloud组件:Eureka服务注册与发现
java·开发语言·后端·spring cloud·eureka
Wang's Blog25 分钟前
Java 中间件之 RabbitMQ 快速入门: SpringAMQP 消息转换器
java·中间件·java-rabbitmq
m0_7156744326 分钟前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
大数据·网络·人工智能·网络安全
天国梦44 分钟前
国密门禁品牌怎么选?2026年最新3个避坑要点
运维·服务器·数据库·python
Re_zero1 小时前
一次 SSE 断流排查:PrintWriter 吞掉了我的 IOException
java·后端
我是人✓1 小时前
Java核心语法:作用域、循环与大数值处理
java·开发语言·后端
dog2502 小时前
带宽,时延,抖动的不可能三角
网络·tcp/ip
夜之眷属2 小时前
PriorityQueue:for-each 遍历和 poll 取出,顺序一样吗?
java·服务器·数据结构·后端·算法