目录

引言

基本概念

1. 进程(Process)

2. 线程(Thread)

线程编程实战

1. 常见线程库

2. 合理设置线程数

3. pthread 创建线程

线程同步机制

1. 互斥锁 pthread_mutex_t

2. 条件变量 pthread_cond_t

3. 读写锁 pthread_rwlock_t

进程的创建与控制

1. fork

2. exec

3. system

4. popen 管道读取输出

进程间通信 IPC 详解

1. 方式对比表:

2. 信号 signal

3. 共享内存 POSIX

总结


引言

本文深入探讨了 C 语言中多线程编程、进程间通信(IPC)机制的底层实现,涵盖线程同步、信号量、互斥锁、共享内存等关键知识,并通过实际任务案例带你走进操作系统世界中的“线程宇宙”

基本概念

1. 进程(Process)

程序的一次执行过程,是操作系统进行资源分配的最小单位。

  • 一个程序至少有一个进程。

  • 每个进程有自己的 地址空间资源集合执行上下文

进程分类:

  • 前台进程

  • 后台进程

  • 服务进程(如守护进程)

运行在服务器上一般都是守护进程。

2. 线程(Thread)

线程是进程中独立的执行单元,是程序执行的最小单位。

  • 一个进程至少有一个主线程(main thread)。

  • 多个线程共享该进程的地址空间和资源。

  • 线程拥有自己的 栈空间寄存器上下文

线程编程实战

1. 常见线程库

  • POSIX Thread:pthread(C语言中最常用)

  • OpenMP:并行处理,适合 C/C++

  • C++11 std::thread(不在本文范围)

2. 合理设置线程数

// CPU 密集型:核心线程数 ≈ CPU数 + 1
// IO 密集型:核心线程数 ≈ ((线程等待时间 / 线程CPU时间) + 1) * CPU数

3. pthread 创建线程

#include <pthread.h>void *thread_func(void *arg) {printf("This is a new thread\n");return NULL;
}int main() {pthread_t tid;pthread_create(&tid, NULL, thread_func, NULL);pthread_join(tid, NULL);  // 等待线程结束return 0;
}

线程同步机制

线程同时访问共享资源时容易引发竞态条件,需进行同步。

1. 互斥锁 pthread_mutex_t

  • pthread_mutex_init

  • pthread_mutex_lock

  • pthread_mutex_unlock

  • pthread_mutex_destroy

2. 条件变量 pthread_cond_t

用于线程间等待与唤醒的机制。

pthread_cond_t cond;
pthread_mutex_t mutex;pthread_cond_init(&cond, NULL);
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);     // 释放锁并阻塞
pthread_cond_signal(&cond);           // 唤醒一个线程
pthread_mutex_unlock(&mutex);

3. 读写锁 pthread_rwlock_t

适用于读多写少的场景。

pthread_rwlock_t rwlock;
pthread_rwlock_init(&rwlock, NULL);pthread_rwlock_rdlock(&rwlock);  // 读锁
pthread_rwlock_unlock(&rwlock);pthread_rwlock_wrlock(&rwlock);  // 写锁
pthread_rwlock_unlock(&rwlock);

进程的创建与控制

1. fork

克隆当前进程,创建子进程。

pid_t pid = fork();
if (pid == 0) {// 子进程
} else {// 父进程
}

2. exec

用新程序替换当前进程的映像。

execl("/bin/ls", "ls", "-l", NULL);

3. system

执行 shell 命令,本质是 fork + exec 的封装。

system("ls -l");

4. popen 管道读取输出

进程间通信 IPC 详解

1. 方式对比表:

方式特点是否跨进程是否阻塞适用场景
管道简单易用父子进程
信号异步通知机制异常处理
信号量原子性控制多进程同步
共享内存访问速度最快大数据共享
消息队列异步通信有序通信
套接字网络/本地通信是/否客户端/服务端通信

2. 信号 signal

#include <signal.h>void handler(int sig) {printf("Caught signal %d\n", sig);
}int main() {signal(SIGINT, handler); // 注册 ctrl+C 的信号处理while (1) pause();
}

3. 共享内存 POSIX

#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>int fd = shm_open("/shm_name", O_CREAT | O_RDWR, 0666);
ftruncate(fd, 4096);
void *ptr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);// 写入共享内存
strcpy((char*)ptr, "Hello from shared memory");munmap(ptr, 4096);
close(fd);
shm_unlink("/shm_name");

总结

通过本文的学习,我们系统掌握了 C 语言中进程与线程的基本概念、线程创建与同步的编程方法,以及多种进程间通信(IPC)机制,包括信号、共享内存、信号量等。进程负责资源的独立管理,线程则提供更轻量级的并发执行方式;同步机制确保了多线程环境下数据的一致性,而 IPC 则使得多个进程间能够高效协作与通信。结合实际案例,我们不仅加深了对操作系统底层原理的理解,也提升了并发编程与系统开发的能力。对于从事系统编程、服务器开发或学习操作系统的同学,这些内容都是必不可少的核心知识。

更多代码可以观看:Niuer_C: C语言学习 0711-0721

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/94509.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94509.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94509.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[假面骑士] 555浅谈

假面骑士555(faiz)是我最先接触的一部平成系列的假面骑士&#xff0c;同时也是我个人最喜欢的一部假面骑士。一、大纲简介震惊&#xff0c;人类最新的进化形态——奥菲一诺&#xff0c;横空出世&#xff01;日本的顶级财团&#xff0c;Smart Brain&#xff0c;的前任社长&#…

Vue Router 路由的创建和基本使用(超详细)

一、路由的基本概念 你是否好奇单页应用&#xff08;SPA&#xff09;是如何在不刷新页面的情况下实现页面切换的&#xff1f;这就离不开路由的功劳。 路由&#xff1a;本质是一组 key-value 的对应关系&#xff0c;在前端领域中&#xff0c;key 通常是路径&#xff0c;value …

深入理解设计模式:策略模式的艺术与实践

在软件开发中&#xff0c;我们经常会遇到需要根据不同情况选择不同算法或行为的场景。传统的做法可能是使用大量的条件语句&#xff08;if-else或switch-case&#xff09;&#xff0c;但随着需求的增加和变化&#xff0c;这种硬编码的方式会导致代码难以维护和扩展。策略模式&a…

概率/期望 DP llya and Escalator

题目链接&#xff1a;Problem - D - Codeforces 看了这篇文章来的&#xff1a;【算法学习笔记】概率与期望DP - RioTian - 博客园 这篇博客写得挺好的&#xff0c;讲了一些常见方法&#xff0c;概率 / 期望的题多练练就上手了。 题目大意&#xff1a; n 个人排队上电梯&…

大陆电子MBDS开发平台转到其他国产控制器平台产生的问题记录

u8_StComLowSpdGearSwt变量为例&#xff0c;之前用的时候只有输入&#xff0c;没什么实际意义&#xff0c;导致新环境下编译报错&#xff0c;缺少声明&#xff0c;解决办法&#xff1a;注释掉输入模块。今天解决的另一个比较大的问题&#xff0c;不同模型函数公用函数模块生成代…

机器学习模型调优实战指南

文章目录模型选择与调优&#xff1a;从理论到实战1. 引言2. 模型评估&#xff1a;为选择提供依据2.1 偏差-方差权衡2.2 数据集划分与分层抽样2.3 交叉验证&#xff08;Cross-Validation&#xff09;2.4 信息准则&#xff08;AIC / BIC&#xff09;3. 超参数调优&#xff1a;让模…

【教程】Unity CI/CD流程

测试机&#xff1a;红帽 Linux8 源码仓库&#xff1a;Gitee - MrRiver/Unity Example   系统环境准备 1&#xff09;yum 源 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo sudo sed -i s/\$releasever/8/g /etc/yum.repos…

文献阅读 | Briefings in Bioinformatics | Hiplot:全面且易于使用的生物医学可视化分析平台

文献介绍文献题目&#xff1a; Hiplot&#xff1a;一个综合且易于使用的 Web 服务&#xff0c;用于增强出版物准备的生物医学数据可视化 研究团队&#xff1a; Openbiox/Hiplot 社区 发表时间&#xff1a; 2022-07-05 发表期刊&#xff1a; Briefings in Bioinformatics 影响因…

【数字图像处理系列笔记】Ch04:灰度变换与空间域图像增强(2)

目录 一、空域滤波基础 一、空域滤波的基本概念 二、空域滤波的数学原理 三、空域滤波器的分类与典型示例 &#xff08;一&#xff09;线性滤波器&#xff08;Linear Filter&#xff09; &#xff08;二&#xff09;非线性滤波器&#xff08;Non-linear Filter&#xff0…

AI浪潮下,FPGA如何实现自我重塑与行业变革

引言&#xff1a;AI 与 FPGA&#xff0c;新时代的碰撞 2025 年&#xff0c;人工智能技术迎来爆发式增长&#xff0c;大模型、生成式 AI 和多模态技术持续突破&#xff0c;人形机器人量产元年正式开启&#xff0c;自动驾驶商业化进程加速&#xff0c;工业数字化转型全面铺开(1)…

系统集成项目管理工程师【第十一章 规划过程组】定义范围、创建WBS、规划进度管理和定义活动篇

系统集成项目管理工程师【第十一章 规划过程组】定义范围、创建WBS、规划进度管理和定义活动篇 一、定义范围&#xff1a;给项目画好"边界线" 定义范围是明确项目和产品"做什么、不做什么"的过程&#xff0c;直接影响后续所有工作的方向。 1. 核心概念与作…

Spring Boot 参数校验全指南

Spring Boot 参数校验全指南 在 Web 开发中&#xff0c;参数校验是保障接口安全性和数据合法性的关键环节。手动编写校验逻辑不仅繁琐&#xff0c;还容易遗漏边界情况。Spring Boot 整合了 validation 工具&#xff0c;提供了一套简洁高效的参数校验方案&#xff0c;可快速实现…

常用技术资料链接

1.team技术 https://zhuanlan.zhihu.com/p/11389323664 https://blog.csdn.net/Lucky_Lu0/article/details/121697151 2.bond切换主备 https://www.xgss.net/3306.html 3.ssh详解&#xff1a; https://cloud.tencent.com/developer/news/105165 https://blog.huochengrm.c…

【Spring Cloud】-- 注册中心

文章目录1. 什么是注册中心2. CPA理论1. 什么是注册中心 注册中心有三种角色&#xff1a; 服务提供者&#xff08;Server&#xff09; &#xff1a;提供接口给其他微服务的程序。服务消费者&#xff08;Client&#xff09;&#xff1a;调用其他微服务提供的接口。**服务注册中…

go-zero 详解

go-zero 详解 go-zero 是一个基于 Go 语言的微服务框架&#xff0c;由字节跳动团队开发并开源&#xff0c;旨在帮助开发者快速构建高可用、高性能的微服务架构。它集成了丰富的组件&#xff0c;简化了微服务开发中的常见问题&#xff08;如服务注册发现、配置管理、限流熔断等&…

接口自动化框架封装之统一请求封装及通过文件实现接口关联

接口自动化测试框架封装目的:简化自动化框架的落地,提高投入和产出比,只要一个人封装好框架,另外的测试通过写yaml测试用例即可实现接口自动化1.统一请求的封装去除多余重复的代码可跨py文件实现通过一个session来自动关联有cookie的接口设置统一公共参数,统一文件处理,统一异常…

Vue 最佳实践:如何利用唯一 key 值保证 el-table 动态渲染的稳定性

&#x1f4cb; 问题描述 在Vue 2.0 ElementUI项目的偏置条件管理页面中&#xff0c;每次切换到"内规拉偏"菜单时&#xff0c;表格样式会发生崩溃&#xff0c;导致表格布局异常、列宽错乱、固定列显示不正确等问题。 &#x1f50d; 问题分析 通过深入分析代码&#x…

popen开启进程,写入数据

通过管道&#xff08;popen&#xff09;启动 SDIWAN_WEB 进程并写入 JSON 数据的过程可以分为以下步骤&#xff0c;结合代码示例和关键注意事项进行说明&#xff1a;1. 核心代码示例 #include <stdio.h> #include <json-c/json.h>int main() {// 1. 创建 JSON 对象…

计算机视觉的四项基本任务辨析

计算机视觉是使计算机能理解采集设备采集的图像视频的一门学科&#xff0c;目的是让计算机实现人的视觉功能——对客观世界的三维场景的感知、识别和理解。换句话说&#xff0c;要让计算机具备通过二维图像认识三维环境的能力。 目录 三个阶段 视觉层级 基本任务 技术难点…

iostat 系统IO监控命令学习

一、iostat 命令描述 “iostat”命令用于监测系统输入/输出设备的负载情况&#xff0c;其通过观察设备处于活跃状态的时间与平均传输速率之间的关系来实现这一目的。该命令会生成报告&#xff0c;这些报告可用于调整系统配置&#xff0c;以更好地平衡物理磁盘之间的输入/输出负…