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

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

相关推荐
微尘寒风7 小时前
【Git】的安装和使用
java·git
y = xⁿ8 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
侧耳倾听1118 小时前
jwt使用简介
java·jwt
顶点多余9 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手9 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
IT大白鼠9 小时前
MSF二次开发与自定义模块编写
网络·安全·web安全·msf
jay神9 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
Julien20049 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
2601_9620664910 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
kekekzt11 小时前
TCP协议的粘包问题介绍,IP分片,MTU,MSS,滑动窗口的概念及之间的关系
网络·网络协议·tcp/ip