同一个 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
→ 这些共享变量必须加锁!否则会崩溃!