Linux高并发服务器开发(六)线程
文章目录
- 1. 前言
- 2 线程相关操作
- 3 线程的创建
- 4 进程数据段共享和回收
- 5 线程分离
- 6 线程退出和取消
- 7 线程属性(了解)
- 8 资源竞争
- 9 互斥锁
- 9.1 同步与互斥
- 9.2 互斥锁
- 10 死锁
- 11 读写锁
- 12 条件变量
- 13 生产者消费者模型
- 14 信号量
- 15 哲学家就餐
1. 前言
进程是CPU 分配资源的最小单位, 线程是系统调度的最小单位。



如果复制对方的地址空间,就产生出一个进程
如果共享对方的地址空间,就产生一个线程

2 线程相关操作




3 线程的创建


4 进程数据段共享和回收



资源回收



5 线程分离



主进程退出,线程也会退出
6 线程退出和取消


线程取消


7 线程属性(了解)

8 资源竞争
打印机模型

9 互斥锁
9.1 同步与互斥
、
互斥: 同一时刻只能一个人使用,必须等一个线程运行完毕,在执行另一个线程。
同步: 使用先后顺序,按次序完成特定的任务。比如A线程的运行依赖于B任务产生的数据。他也是一种互斥,但有先后顺序。
9.2 互斥锁
防止同一个资同时被多个任务使用。

初始化互斥锁

销毁

上锁

解锁




10 死锁




11 读写锁
读写锁是一个锁,读锁和写锁都是也给锁中的东西


初始化







12 条件变量








13 生产者消费者模型


#include<stdio.h>
#include<stdlib.h>
#include<string.h>#include<pthread.h>
#include <unistd.h> typedef struct _node_t
{int data;struct _node_t *next;}node_t;node_t *head = NULL;pthread_cond_t cond;
pthread_mutex_t mutex;void *producer(void* arg)
{while(1){pthread_mutex_lock(&mutex);node_t *new = malloc(sizeof(node_t));if(NULL == new){printf("malloc failed");break;}memset(new, 0 ,sizeof(node_t));new->data = random() % 100 +1;new->next = NULL; new->next = head;head = new;printf("生产者生产产品 %d\n", new->data);pthread_mutex_unlock(&mutex);pthread_cond_signal(&cond);sleep(random()%3 +1);}return NULL;}void *customer(void* arg)
{node_t *tmp = NULL;// 循环消费while(1){pthread_mutex_lock(&mutex);if(NULL == head){// 等待 printf("产品链表为空");pthread_cond_wait(&cond, &mutex);}else{// 删除第一个节点tmp = head;head = head->next;printf("消费者消费 %d\n", tmp->data);free(tmp);pthread_mutex_unlock(&mutex);sleep(random() %3 +1);}}return NULL;}int main()
{pthread_t tid1 = -1, tid2 = -1;srandom(getpid());int ret = -1;ret = pthread_mutex_init(&mutex, NULL);if(0!= ret){printf("pthread_cond_inti failed");return 1;}ret = pthread_cond_init(&cond, NULL);if(0!= ret){printf("pthread_cond_inti failed");return 1;}// 创建线程 生产者线程和消费者线程pthread_create(&tid1, NULL, producer, NULL);pthread_create(&tid2, NULL, customer, NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);pthread_mutex_destroy(&mutex);pthread_cond_destroy(&cond);return 0;
}
14 信号量

P操作,占用资源
V操作,释放资源










15 哲学家就餐

相关文章:
Linux高并发服务器开发(六)线程
文章目录 1. 前言2 线程相关操作3 线程的创建4 进程数据段共享和回收5 线程分离6 线程退出和取消7 线程属性(了解)8 资源竞争9 互斥锁9.1 同步与互斥9.2 互斥锁 10 死锁11 读写锁12 条件变量13 生产者消费者模型14 信号量15 哲学家就餐 1. 前言 进程是C…...
Google发布Gemma 2轻量级开放模型 以极小的成本提供强大的性能
除了 Gemini 系列人工智能模型外,Google还提供 Gemma 系列轻量级开放模型。今天,他们发布了 Gemma 2,这是基于全新架构设计的下一代产品,具有突破性的性能和效率。 Gemma 2 有两种规格:90 亿 (9B) 和 270 亿 (27B) 个参…...
精品UI知识付费系统源码网站EyouCMS模版源码
这是一款知识付费平台模板,后台可上传本地视频,批量上传视频连接, 视频后台可设计权限观看,免费试看时间时长,会员等级观看,付费观看等功能, 也带软件app权限下载,帮助知识教育和软件…...
使用Apache POI库在Java中导出Excel文件的详细步骤
使用Apache POI库在Java中导出Excel文件的详细步骤 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技…...
基于C#在WPF中使用斑马打印机进行打印
最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来。苦苦折腾了两天,总算有所收获,就发到网上来骗骗分数-_-|| 项目中使用的打印机型号为GX430t的打印机,接手的时候,自己对于打印机这块儿是眼前…...
六、资产安全—信息分级资产管理与隐私保护练习题(CISSP)
六、资产安全—信息分级资产管理与隐私保护(CISSP): 六、资产安全—信息分级资产管理与隐私保护(C...
使用 AutoGen 的 AI 智能体设计模式
1.Auto Gen框架 在Auto中,每种智能体分别扮演不同的角色。 ConversableAgent 作为最高级别的智能体抽象,为所有具体智能体提供了基础的通信能力。这包括发送和接收信息的能力,以及基于这些信息进行内部状态更新的能力。所有从这个类派生的智能体都继承了这些基本功能…...
Android InputChannel连接
InputChannel是InputDispatcher 和应用程序 (InputTarget) 的通讯桥梁,InputDispatcher 通知应用程序有输入事件,通过InputChannel中的socket进行通信。 连接InputDispatcher和窗口 WinodwManagerService:addwindow: WMS 添加窗口时,会创建…...
爬虫笔记17——selenium框架的使用
selenium框架的使用 1、python程序安装selenium框架2、下载Chrome谷歌驱动3、selenium的基本使用4、多个标签页切换顺序混乱的问题 1、python程序安装selenium框架 # 在安装过程中最好限定框架版本为4.9.1 # pip install selenium 没有制定版本,非镜像下载也会比较…...
[BUUCTF从零单排] Web方向 02.Web入门篇之『常见的搜集』解题思路(dirsearch工具详解)
这是作者新开的一个专栏《BUUCTF从零单排》,旨在从零学习CTF知识,方便更多初学者了解各种类型的安全题目,后续分享一定程度会对不同类型的题目进行总结,并结合CTF书籍和真实案例实践,希望对您有所帮助。当然࿰…...
深度相机识别物体——实现数据集准备与数据集分割
一、数据集准备——Labelimg进行标定 1.安装labelimg——pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple 2.建立相应的数据集存放文件夹 3.打开labelimg,直接在命令行输入labelimg即可,并初始化 4.开始标注,设置标注好…...
STM32第十一课:ADC采集光照
文章目录 需求一、ADC概要二、实现流程1.开时钟,分频,配IO2.配置ADC工作模式3.配置通道4.复位校准5.数值的获取 三、需求的实现总结 需求 通过ADC转换实现光照亮度的数字化测量,最后将实时测量的结果打印在串口上。 一、ADC概要 ADC全称是A…...
python查找支撑数 青少年编程电子学会python编程等级考试三级真题解析2022年3月
目录 python查找支撑数 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python查找支撑数 2022年3月 python编程等级考试级编程题 一、题目要求…...
创建一个快速、高效的网络爬虫:PHP和Selenium示例
随着互联网的不断发展,数据爬取已经成为了许多人的必备技能。而网络爬虫则是实现数据爬取的重要工具之一。 网络爬虫可以自动化地访问网站、获取内容、分析页面并提取所需数据。其中,Selenium是一款非常优秀的网络自动化测试工具,能够模拟真…...
两张图片怎样拼在一起?将两张图片拼在一起的几种方法介绍
两张图片怎样拼在一起?拼接两张图片是一种常见的编辑技巧,能够将不同的视觉元素融合成一个整体,从而创造出更加生动和丰富的图像效果。无论是为了设计创意作品、制作社交媒体内容,还是简单地为个人相册增添趣味,掌握如…...
百日筑基第五天-关于maven
百日筑基第五天-关于maven Maven 是什么 Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个依赖…...
【CSS in Depth 2 精译】2.2 em 和 rem + 2.2.1 使用 em 定义字号
当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem ✔️ 2.2.1 使用 em 定义字号 ✔️2.2.2 使用 rem 设置字号 2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.…...
C++Primer Plus 第十四章代码重用:14.4.4 数组模板示例和非类型参数
系列文章目录 14.4.4 数组模板示例和非类型参数 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录14.4.4 数组模板示例和非类型参数 14.4.4 数组模板示例和非类型参数 模板常用作容器类,这…...
短视频哪个软件好用?成都柏煜文化传媒有限公司
短视频哪个软件好用?一文带你了解各大平台特色 随着移动互联网的飞速发展,短视频已经成为现代人生活中不可或缺的一部分。市面上涌现出众多短视频平台,它们各具特色,满足了不同用户的需求。那么,短视频哪个软件好用呢…...
金融科技:重塑用户体验,驱动满意度飙升
随着科技的飞速发展,金融科技(FinTech)已经深入到我们生活的每一个角落,从日常支付到投资理财,再到跨境汇款,它都在悄无声息地改变着我们的金融行为。而在这背后一个不可忽视的驱动力就是金融科技对用户体验…...
微信小程序逆向工程终极指南:wxappUnpacker深度解析与实用技巧
微信小程序逆向工程终极指南:wxappUnpacker深度解析与实用技巧 【免费下载链接】wxappUnpacker forked from https://github.com/qwerty472123/wxappUnpacker 项目地址: https://gitcode.com/gh_mirrors/wxappu/wxappUnpacker 微信小程序逆向工程是开发者深入…...
SpringBoot+Vue Spring Boot可盈保险合同管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
系统架构设计### 摘要 随着保险行业的快速发展,传统的手工管理模式已无法满足现代保险业务的高效需求。保险合同管理系统作为保险业务的核心支撑,亟需通过信息化手段提升管理效率,降低人工操作错误率。当前市场上许多保险公司的合同管理仍依赖…...
微信网页版访问难题如何破解?wechat-need-web浏览器扩展的轻量级替代方案探索
微信网页版访问难题如何破解?wechat-need-web浏览器扩展的轻量级替代方案探索 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否曾在公…...
支持多渠道的语音机器人 2026 企业选型攻略:智能核心引擎
在客户体验驱动业务增长的时代,企业热线早已不是“有人接电话”那么简单。随着大模型技术与通信系统的深度融合,多渠道语音机器人正从传统的“按键导航”进化为能够理解情绪、动态决策的智能客服专家。2026年,如何选择一款真正适配业务场景、…...
基于C语言实现(控制台)小型文件系统
♻️ 资源 大小: 3.40MB ➡️ 资源下载:https://download.csdn.net/download/s1t16/87430288 小型文件系统 一、需求分析 1.1 小型文件系统介绍 科技的进步已将人类带入了信息大爆炸的时代,随着计算机科学技术的不断发展,计算…...
基于MCP协议快速构建AI助手自定义工具:从入门到生产实践
1. 项目概述:一个为AI助手打造自定义工具的快速启动器如果你正在使用Claude Desktop或者Cursor这类AI编程助手,并且觉得它们内置的功能还不够用,比如你想让它直接查询你项目的数据库、调用某个内部API,或者执行一些特定的文件操作…...
基于Next.js 14与Sanity构建高性能个人博客:全栈技术栈解析与实践
1. 项目概述:一个现代、高性能的个人博客系统 最近在折腾个人博客,发现了一个非常亮眼的开源项目——CaliCastle/cali.so。这不仅仅是一个博客模板,更是一个集成了当前前端最佳实践的完整个人网站解决方案。原作者Cali(Calvin&am…...
ARM NEON指令集VLD1加载操作原理与优化实践
1. ARM SIMD指令集与VLD1加载操作概述在现代处理器架构中,SIMD(Single Instruction Multiple Data)技术已成为提升计算性能的关键手段。作为ARM架构中Advanced SIMD指令集(俗称NEON)的重要组成部分,VLD1系列…...
别再死记硬背公式了!用‘井字棋’和‘抢30’游戏带你直观理解巴什博弈(Bash Game)
用童年游戏破解数学奥秘:从"抢30"到巴什博弈的思维跃迁 记得小时候和伙伴们玩"抢30"游戏吗?两人轮流报数,每次可以说1到3个连续数字,谁先喊出"30"谁就获胜。这个看似简单的游戏背后,隐藏…...
基于MCP协议与Docker为Claude Code构建Brave搜索服务器Argus
1. 项目概述:为Claude Code打造一个“全视之眼” 如果你和我一样,日常重度依赖Claude Code来辅助编程、查资料、写文档,那你一定遇到过这样的痛点:当Claude需要联网搜索时,要么得手动复制粘贴,要么得依赖一…...
