两个线程对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

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

相关推荐
@小匠6 分钟前
Spring Boot Nacos绑定 Map 时中文 key 导致启动失败:一次从复现到源码的排查实录
java·开发语言·前端
Knight_AL6 分钟前
Lombok @Builder 踩坑:build() 前后对象类型不一样
android·java·开发语言
SamChan9029 分钟前
PDF翻译中的并发控制:用Semaphore防止API限流与资源耗尽
java·jvm·pdf
大黄说说39 分钟前
Java 与 Kotlin 混合开发避坑指南:老项目平滑迁移 Kotlin 实操手册
java·开发语言·kotlin
xiaoxiangsiyan1 小时前
企业网络运维自动化与管理协议深度指南
linux·运维·服务器·网络·学习·自动化
風穆1 小时前
多云时代的“服务器比价网”:OopsVPS 实用主义指南
服务器
wgh6531 小时前
旁挂组网双机热备负载分担
运维·服务器
长江&后浪1 小时前
华为M-LAG配置小实验
网络
2301_777998341 小时前
网络基础(一):协议与网络传输基本流程
linux·网络
snow@li1 小时前
SpringBoot:AOP日志切面全景梳理/原理+流程+实战+避坑
java·开发语言·spring boot