当前位置: 首页 > news >正文

Linux网络编程踩坑:多线程并发服务器中文件描述符的正确传递方式

在编写多线程并发服务器(Multi-threaded Server)时,最容易让新手“翻车”的一个细节就是如何将主线程接收到的文件描述符(File Descriptor, fd)正确地传递给子线程

很多初学者会发现,明明代码逻辑看起来没问题,但当多个客户端同时连接时,消息却发错乱了(比如客户端A发的消息被服务器回传给了客户端B)。本文将基于课堂笔记,深度解析这个经典的“内存共享陷阱”,并提供正确的解决方案。

一、 问题背景:为什么不能直接传地址?

1. 典型错误场景

在主线程的while循环中,我们通常会这样做:

  1. 调用accept()阻塞等待,返回一个新的文件描述符cfd
  2. 调用pthread_create()创建子线程。
  3. 错误操作:将cfd的地址(&cfd)作为参数传递给子线程。

2. 原因深度剖析

这涉及到了进程与线程的内存模型差异

  • 进程(Process):拥有独立的虚拟地址空间。修改一个进程的变量不会影响另一个进程(写时复制)。
  • 线程(Thread):共享同一个进程的虚拟地址空间(堆、全局变量等)。

灾难发生的流程如下:

  1. 时刻 T1:主线程accept成功,cfd变量被赋值为3(代表客户端 A)。
  2. 时刻 T2:主线程调用pthread_create,传入&cfd
  3. 时刻 T3:主线程继续循环,再次accept成功,cfd变量被更新为4(代表客户端 B)。
  4. 时刻 T4:子线程 A 开始运行,通过传入的地址&cfd去读取数据。此时它读到的是被修改后的值 4

结果:子线程 A 本该服务客户端 A(fd=3),结果却拿到了 fd=4,导致它错误地与客户端 B 进行了通信,或者发生“串台”现象。


二、 解决方案:构建描述符管理数组

为了避免上述竞态条件(Race Condition),我们需要保证每个子线程拿到的文件描述符是存储在独立内存区域中的,互不干扰。

核心思路:

  1. 定义一个全局结构体数组(或整型数组)。
  2. 主线程accept成功后,遍历数组找到一个“空闲位置”。
  3. cfd存入该位置。
  4. 该数组元素的地址传递给子线程。

这样,即使主线程的cfd局部变量变了,数组中存储的值也不会变。


三、 代码实战

下面是一个完整的、可运行的多线程并发服务器代码案例。

1. 代码实现 (server_fixed.c)

#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<arpa/inet.h>#include<pthread.h>#include<ctype.h>#defineMAX_CONN1024#definePORT8888// 定义一个结构体来存储每个连接的信息structSockInfo{intfd;// 通信文件描述符structsockaddr_inaddr;// 客户端地址信息(可选,方便日志打印)};// 全局数组,用于管理所有连接// 初始化时需要将fd设为-1,表示空闲structSockInfoinfos[MAX_CONN];// 子线程的工作函数void*worker(void*arg){// 1. 将参数强转回结构体指针structSockInfo*pinfo=(structSockInfo*)arg
http://www.jsqmd.com/news/328354/

相关文章:

  • 社交媒体内容管理工具深度评测:douyin-downloader技术原理与实战优化
  • 2026年口碑好的电加热炉/红外节能加热炉厂家推荐及选购指南
  • Windows蓝牙优化工具与AirPods跨平台适配技术解析
  • 2026河南工业机器人培训市场深度解析与机构优选指南
  • [解决方案] 抖音视频批量下载系统设计与实现:从需求分析到资源调度
  • SMUDebugTool:Ryzen平台硬件全流程控制的专业级调试方案
  • Vue—— Vue3 + Node.js 后台管理系统 之 【组件通信技巧】
  • 游戏模组管理工具2024版:多游戏兼容的新手友好解决方案
  • 2026年比较好的陶瓷衬板/氧化铝陶瓷衬板厂家最新TOP排行榜
  • 2026年靠谱的记忆棉枕/护颈记忆棉枕厂家最新热销排行
  • 2026年比较好的移动垃圾站设备/竖直直压式垃圾站产品质量信赖榜
  • Vue Flow嵌套流程图实战进阶:层级数据可视化与业务流程建模指南
  • Vue—— Vue3 + Node.js 后台管理系统 之 【主题系统动态应用】
  • 2026年热门的扭矩测试仪/平板测试仪行业内口碑厂家排行榜
  • 2026年长沙厨房燃料液蜡实力厂家推荐与采购指南
  • 笔记本散热优化指南:如何通过智能风扇调节提升ThinkPad使用体验
  • 3阶段优化法:从卡顿到电竞级体验
  • 2026年质量好的自动化检测设备钣金加工/净水设备钣金加工厂家推荐及选购参考榜
  • 如何高效备份抖音直播内容?直播回放管理工具实战指南
  • 2026年耐用的48V 电动车电池/电动车电池高评价厂家推荐
  • 解决游戏控制器识别难题的ViGEmBus虚拟设备驱动
  • 2026年1月长沙厨房燃料白油供应厂家综合评测与选型指南
  • 2026年初专业的长沙厨房燃料液蜡供应商选哪家
  • 3步解锁AI游戏助手:让2048突破10000分的秘密武器
  • 城通网盘下载速度受限问题的技术解决方案与性能优化实践
  • 想保存无水印视频却不会技术?这款免费工具3步轻松搞定!
  • 2026年评价高的粘玉米碴加工成套设备/玉米碴加工成套设备用户好评厂家排行
  • 忘记QQ号不用愁!手机号查QQ工具使用指南
  • 文献管理效率提升:Ethereal Style插件的问题诊断与优化策略
  • 2026年知名的玉米磨面机/燕麦磨面机厂家最新热销排行