news 2026/4/23 9:22:33

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/4/16 20:03:01

AirPodsDesktop:让Windows系统实现苹果级耳机体验的开源方案

AirPodsDesktop&#xff1a;让Windows系统实现苹果级耳机体验的开源方案 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop 在Win…

作者头像 李华
网站建设 2026/4/18 1:58:01

开源字体全栈应用指南:从技术特性到多场景落地

开源字体全栈应用指南&#xff1a;从技术特性到多场景落地 【免费下载链接】source-han-sans-ttf A (hinted!) version of Source Han Sans 项目地址: https://gitcode.com/gh_mirrors/so/source-han-sans-ttf 核心特性解析&#xff1a;构建专业字体系统的四大支柱 实现…

作者头像 李华
网站建设 2026/4/17 20:13:32

MySQL 基础教程 - 第八章:索引与性能优化基础

MySQL 基础教程 - 第八章&#xff1a;索引与性能优化基础 摘要&#xff1a;本章将深入探讨 MySQL 数据库性能优化的核心——索引。我们将从底层 B 树数据结构讲起&#xff0c;详细介绍索引的分类、创建方法及设计原则&#xff08;如最左前缀法则、覆盖索引&#xff09;。同时&a…

作者头像 李华
网站建设 2026/4/18 22:59:02

推荐3个超级实用并且HR也推荐的简历模板工具

在2026年的求职市场中&#xff0c;找到一份合适的工作并不容易。很多求职者存在一个误区&#xff0c;以为所有的简历都会立刻进入机器筛选系统&#xff08;ATS&#xff09;。事实并非完全如此。招聘市场其实是分层的&#xff1a;中小企业&#xff08;SME&#xff09;&#xff1…

作者头像 李华