news 2026/6/20 14:22:21

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 5:11:43

3步解锁AI游戏助手:让2048突破10000分的秘密武器

3步解锁AI游戏助手&#xff1a;让2048突破10000分的秘密武器 【免费下载链接】2048-ai AI for the 2048 game 项目地址: https://gitcode.com/gh_mirrors/20/2048-ai 告别无效尝试&#xff0c;AI带你轻松掌握数字合并的艺术 你是否在2048游戏中经常陷入数字杂乱无章的困…

作者头像 李华
网站建设 2026/6/20 13:41:41

Ryzen优化指南:用SMUDebugTool实现硬件调优与性能释放

Ryzen优化指南&#xff1a;用SMUDebugTool实现硬件调优与性能释放 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

作者头像 李华
网站建设 2026/6/16 21:05:43

SMUDebugTool完全指南:Ryzen系统调试与性能优化实战手册

SMUDebugTool完全指南&#xff1a;Ryzen系统调试与性能优化实战手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…

作者头像 李华
网站建设 2026/6/17 17:12:02

工业级3D模型优化与STL格式转换全指南

工业级3D模型优化与STL格式转换全指南 【免费下载链接】sketchup-stl A SketchUp Ruby Extension that adds STL (STereoLithography) file format import and export. 项目地址: https://gitcode.com/gh_mirrors/sk/sketchup-stl 在工业级3D打印流程中&#xff0c;3D模…

作者头像 李华
网站建设 2026/6/19 1:10:17

抖音视频下载工具使用指南:从需求到落地的完整方案

抖音视频下载工具使用指南&#xff1a;从需求到落地的完整方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容爆炸的时代&#xff0c;高效获取和管理社交媒体视频已成为内容创作者、研究人员和普…

作者头像 李华