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

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

相关推荐
l软件定制开发工作室14 小时前
Spring开发系列教程(35)——使用Actuator
java·后端·spring
Liangwei Lin15 小时前
LeetCode 155. 最小栈
java·javascript·算法
Olivia0514051415 小时前
Voohu:CHIP LAN在2.5G/5G多速率以太网中的共模抑制带宽要求与选型
网络
mzhan01715 小时前
Linux: signal: SIGALRM; alarm: ITIMER_REAL
linux·运维·服务器
●VON15 小时前
纯ArkUI实现7层拟物3D环形进度图:零依赖的视觉革命
服务器·3d·app·鸿蒙·von
mzhan01715 小时前
Linux: compare的直观性
java·linux·服务器
mask哥16 小时前
力扣算法java实现汇总整理(下)
java·算法·leetcode
爱喝水的鱼丶16 小时前
SAP-ABAP:SAP 与 ABAP 关联逻辑与入门路径:业务×开发的协作指南
服务器·前端·数据库·学习·sap·abap
原来是猿16 小时前
TCP Server 业务扩展实战:从 Echo 到远程命令执行与词典翻译
linux·运维·服务器
小陈的进阶之路16 小时前
Python系列课(2)——判断
java·前端·python