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

Linux操作系统软件编程——多线程

什么是线程线程的定义是轻量级的进程可以实现多任务的并发。线程是操作系统任务调度的最小单位一个进程至少有一个线程线程的创建由某个进程创建且进程创建线程时会为其分配独立的栈区空间默认8M。线程和所在的进程以及进程中的其他线程共用进程的堆区、文本区、数据区kernel内核空间stack从高地址向低地址增长的栈区属于线程独享存放局部变量、函数的返回地址、函数的参数heap从低地址向高地址增长的堆区用户自行管理的空间使用时需要手动申请及释放map内存映射区存放动态共享库、文件映射、匿名映射bss未初始化及初始化为0的全局及静态变量data初始化为非0的全局及静态变量code只读代码段存放可执行的二进制程序线程的调度宏观并行微观串行进程和线程的区别进程线程定义正执行中的程序程序中的一条执行线路单位操作系统资源分配的最小单位操作系统任务调度的最小单位资源消耗资源消耗开销大每次创建都需要有0-4G的虚拟内存空间资源消耗开销较小只需要由所在进程为其开辟默认8M的栈区空间效率由操作系统创建创建耗时大跨进程调度慢由进程创建创建耗时小跨线程调度快通信通信复杂进程间不能直接通信需要使用进程间通信机制IPC通信简单可以使用线程共享的区域通信例如全局变量安全性安全性和稳定性较高因为各个进程空间独立安全性和稳定性较低一个线程异常可能影响同一进程中的线程线程相关编程线程的创建pthread_create()pthread_self()获取当前线程的ID号线程的调度由操作系统调度线程的凋亡1线程退出在线程任务函数中使用return结束线程或者调用pthread_exit()结束线程2线程回收pthread_join(tid,NULL)pthread_create()功能创建一个新的线程参数thread保存线程ID的变量地址attr线程属性的对象地址如果是NULL则按照默认属性创建void *(*start_routine)(void *)函数指针指向线程启动后要执行的任务指针名称start_routine指向的对象函数void *()(void *)即仅传函数名如果在函数名后加括号并传参则实际上传入的是该函数的返回值并非该函数arg为线程任务函数传递的参数如果不传参则传NULL如果要传入多个参数可以将多个参数组合到一起为一个结构体然后传入结构体地址返回值成功则为0失败则为!0需要注意的是在使用这个函数时需要在创建或者编译时加上后缀如图所示当进程中创建了线程不要直接退出进程线程之后就接return在return之前设立一个死循环或者sleep否则可能线程还未执行进程就优先结束连带着线程也结束下面的两种情形值得说明一下对于第一个参数它需要的是一个存放ID的变量即将该函数创建的线程的ID号存到变量中通过传入这个变量的地址来确定存到哪个变量中它并不是把这个变量的地址赋到一个指针中所以第二种情况是错误的因为此时的thread属于野指针会把ID号赋给这个指针程序出现段错误对于部分其他函数也会出现这种情况。pthread_exit()功能退出一个线程任务参数向回收的线程传递的参数的地址如果不传递参数则为NULLpthread_exit(NULL)等价于return NULLpthread_join()功能阻塞等待回收线程资源空间参数要回收的线程ID用来保存线程退出时传递的参数与上一个函数搭配NULL表示不接收传递的参数返回值成功为0失败为-1线程属性1分离属性不需要被其他线程回收的线程将来会被操作系统回收2非分离属性可以被其他线程回收或者结束的线程默认属性为非分离属性线程回收策略1分离属性的线程不需要回收没有空闲的线程可以帮忙回收2调用pthread_join阻塞回收int pthread_detach(pthread_t thread)功能将线程设置成分离属性的线程线程间通信临界资源多个线程可以同时访问的资源例如全局变量共享内存区域然而在多个线程在访问临界资源时会存在资源竞争问题如下如果按照代码正常思路最后输出应该是200000但是最后却输出199997这是由于对于全局变量n其中一个线程调用并进行操作还未将结果重新赋予时另一个线程也进行了调用导致两个线程赋予了同一个值。事实上数字越大越容易出现这种情况但是并不代表每次运行都会出现这种情况所以为了完全避免这种资源竞争问题需要用到互斥机制互斥机制——锁互斥机制多个线程访问临界资源时具有排他性访问的机制即一次只允许一个线程对该临界资源进行访问实现互斥机制的步骤1创建互斥锁pthread_mutex_t2初始化互斥锁pthread_mutex_init3锁上int pthread_mutex_lock(pthread_mutex_t *mutex)4解锁int pthread_mutex_unlock(pthread_mutex_t *mutex)5销毁锁int pthread_mutex_destroy(pthread_mutex_t *mutex)pthread_mutex_init功能初始化互斥锁参数锁住对象的地址锁的属性如果是NULL则为默认属性返回值成功则为0失败则为-1所以上述的例子可改为死锁指的是在多线程环境中每个执行流线程都有未释放的资源且互相请求对方未释放资源从而导致陷入永久等待状态的情况。锁包括互斥锁、信号量、自旋锁、读写锁等等现象1没有释放锁2重复加锁3多线程多锁抢占锁资源不当例线程A获得了1锁B获得了2锁同时线程A向获得2锁B想获得1锁产生死锁的必要条件1互斥条件 一个资源只能被一个进程使用一个执行流获取锁后其他执行流不能再获取该锁2请求与保持条件一个进程因请求资源而阻塞时对已获得的资源保持不放执行流本身使用者一把锁并不释放还请求别的锁3不剥夺条件进程已获得的资源再未使用完之前不能强行剥夺A执行流拿着锁其他执行流不能释放4循环等待条件若干进程之间形成一种头尾相接的循环等待资源关系多个执行流拿着对方想要的锁并且各执行流需要获取对方已持有的锁才能继续执行四个必要条件都达成时候一定是死锁有一种条件未达成时就构不成死锁死锁的预防1锁一定要成对出现即有pthread_lock就一定要有pthread_unlock2使线程的加锁顺序一致3破坏环路等条件。使用非阻塞锁一旦线程发现请求的锁被使用就去释放自己拥有的锁例如pthread_mutex_trylock()int sem_trywait(sem_t *sem)线程间的同步机制——信号量让多个线程再执行某个任务时具有先后顺序地执行而多线程、多进程本质是异步执行线程间的同步通过信号量实现步骤如下1定义信号量对象sem_t sem2初始化信号量sem_init()3PV操作申请信号量P释放信号量Vsem_wait()sem_post()4销毁信号量int sem_destroy(sem_t *sem)int sem_init(sem_t *sem, int pshared, unsigned int value)功能对信号量进行初始化参数sem要初始化的信号量对象地址pshared0为线程间共享非0为进程间共享value信号量初始值如果是0则不执行1则执行返回值成功为0失败为-1int sem_wait(sem_t *sem)功能申请信号量int sem_post(sem_t *sem)功能释放信号量左侧为加了信号量的代码右侧为未加信号量的代码代码的公共区域未加信号量的代码是异步的没有先后输出顺序加了信号量的代码是同步的即有输出的先后顺序值得注意的是一定要先初始化再执行PV操作。为保证线程执行的顺序PV操作时P的是该线程的信号量并减一V的是下一个该执行的线程的信号量并加一在进行P操作时会进行阻塞即如果该信号量为0则会等待信号量变为1再执行一般来说pthread_join会放在sem_destroy之前来确保所有线程结束不会再有线程对信号量进行操作然后再进行信号量的销毁

相关文章:

Linux操作系统软件编程——多线程

什么是线程线程的定义是轻量级的进程,可以实现多任务的并发。线程是操作系统任务调度的最小单位,一个进程至少有一个线程线程的创建由某个进程创建,且进程创建线程时,会为其分配独立的栈区空间(默认8M)。线…...

三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南

三阶段掌握罗技鼠标压枪宏:从新手到精准射击的完整指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 你是否在绝地求生中遇到过这样…...

软银携手DeltaX建储能基地,2027年量产应对AI算力电力挑战

软银与DeltaX合作:储能系统建设的新布局品玩5月12日消息,据The Elec报道,软银集团选定韩国初创公司DeltaX,负责在日本大阪建设数据中心储能系统(ESS)的开发与制造。双方计划于今年下半年在大阪堺市原夏普工…...

GitHub 代码提交常见问题及解决指南

摘要本文聚焦 GitHub 代码提交流程,围绕本地文件上传、远程仓库关联、分支推送等核心操作,梳理常见报错(如可疑所有权、分支不匹配、协议不支持等),解析错误成因并提供分步解决方法,覆盖 Git 命令执行、仓库…...

告别预装旧版Demo:详解mmWave SDK两种刷写模式(Demonstration vs. CCS Development)及适用场景

告别预装旧版Demo:详解mmWave SDK两种刷写模式(Demonstration vs. CCS Development)及适用场景 当你第一次拿到毫米波雷达评估模块(EVM)时,预装的Demo固件可能已经过时半年甚至更久。这时候你会面临一个关键…...

Taotoken提供的审计日志功能如何满足企业级安全与合规需求

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken提供的审计日志功能如何满足企业级安全与合规需求 1. 企业引入大模型能力后的审计挑战 当企业将大模型API能力整合到内部…...

HealthGPT入门教程:5分钟快速搭建你的个人健康助手

HealthGPT入门教程:5分钟快速搭建你的个人健康助手 【免费下载链接】HealthGPT Query your Apple Health data with natural language 💬 🩺 项目地址: https://gitcode.com/gh_mirrors/he/HealthGPT 想要用自然语言查询你的Apple健康…...

在自动化客服场景中利用Taotoken实现多模型智能路由

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在自动化客服场景中利用Taotoken实现多模型智能路由 对于构建智能客服系统的产品团队而言,核心挑战之一是如何在保证服…...

那些被“写不动“耽误的好想法,现在可以试了

脑子里的想法永远比手头的代码多。想做一个新的仲裁逻辑,想验证一种不同的流水线划分,想试试那个"也许能行"的微架构调整——但最终都没动手,因为光是搭环境、写testbench、跑仿真这一套下来,没有一两周根本出不了结论。…...

论文降AIGC教程:从标红区到安全线,2026最新3步攻略与工具测评

今年的交稿季有一点很磨人:除了文章重复率,AIGC检测率几乎也成了各处的标配,很多小伙伴接到通知直接懵了。 我之前也有过长文盲改失败的经历:刚拿到初稿就开始一通操作,觉得把文段里面的词语换换同义词就行&#xff0…...

Flutter + 开源鸿蒙实战 | 极简记账本 Day1:项目初始化 + 底部导航框架搭建

🔥 Flutter 开源鸿蒙实战 | 极简记账本 Day1:项目初始化 底部导航框架搭建欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net 系列项目:极简记账本(6 天完结)环境:Flutt…...

5分钟快速上手APK Installer:在Windows上安装Android应用的终极指南

5分钟快速上手APK Installer:在Windows上安装Android应用的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否想在Windows电脑上直接安装和运行…...

工业通信网络实战:从工业以太网、IO-Link到智能工厂连接架构设计

1. 项目概述:智能工厂的“神经网络”革命如果你最近参观过任何一家现代化的汽车装配线或是消费电子产品的贴片车间,可能会被那些高度协同、几乎无人干预的自动化流程所震撼。机械臂精准地抓取、焊接、组装,AGV小车沿着无形的轨道穿梭运送物料…...

DavyBot开源框架:构建智能对话机器人的模块化实践指南

1. 项目概述:一个开箱即用的智能对话机器人框架最近在折腾聊天机器人项目,发现了一个挺有意思的开源项目,叫geluzhiwei1/davybot。乍一看这个名字,可能觉得有点陌生,但如果你在GitHub上搜索过聊天机器人、智能客服或者…...

从零到一:基于C#与ArcGIS二次开发构建迎风面指数计算插件实战

1. 环境准备与工具搭建 第一次接触ArcGIS二次开发时,我被官方文档里密密麻麻的API吓得不轻。后来发现只要配好环境,开发插件比想象中简单得多。你需要准备三样东西:Visual Studio(建议2019或2022社区版)、ArcGIS Desk…...

LibreHardwareMonitor:你的电脑健康管家,硬件监控从此无忧

LibreHardwareMonitor:你的电脑健康管家,硬件监控从此无忧 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor is free software that can monitor the temperature sensors, fan speeds, voltages, load and clock speeds of your computer…...

终极免费PDF转SVG工具:简单3步完成高质量转换

终极免费PDF转SVG工具:简单3步完成高质量转换 【免费下载链接】pdf2svg A simple PDF to SVG converter using the Poppler and Cairo libraries 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2svg 在当今数字化时代,PDF转SVG已成为设计师、开…...

小白程序员必看:收藏这份AI黑话指南,轻松入门大模型世界!

本文用大白话解释了AI领域几个核心概念:AI是总称,LLM是推理模型,Agent能独立执行任务,MCP是标准化接口,Skills是技能包。文章通过生活化比喻和实例,帮助读者理解这些概念如何协同工作,实现高效自…...

Hermes Agent 可视化监控与文档生成工具 hermes-dashboard 详解

1. 项目概述与核心价值如果你正在使用 Hermes Agent 进行 AI 智能体开发,或者对 Agent 的内部运行状态感到好奇,那么你很可能需要一个“上帝视角”。hermes-dashboard正是这样一个工具,它为你提供了一个实时的监控仪表盘和一个自动生成的、可…...

通过 curl 命令在 Ubuntu 终端快速测试 Taotoken 的 API 连通性

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 curl 命令在 Ubuntu 终端快速测试 Taotoken 的 API 连通性 在服务器或容器环境中进行开发或部署时,直接使用 curl…...

DreamBooth实战案例:从人物肖像到艺术风格的完整训练过程

DreamBooth实战案例:从人物肖像到艺术风格的完整训练过程 【免费下载链接】sd_dreambooth_extension 项目地址: https://gitcode.com/gh_mirrors/sd/sd_dreambooth_extension DreamBooth是一款强大的AI模型训练工具,能够让你通过少量图片快速定制…...

Cursor Pro激活器:终极解决方案告别API限制,实现无限免费使用

Cursor Pro激活器:终极解决方案告别API限制,实现无限免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youv…...

AI代理技术如何赋能新生儿护理:从数据记录到个性化模式学习

1. 项目概述:当AI成为新手父母的“第二大脑”孩子出生的头三个月,被无数过来人称为“生存模式”。这不是夸张。在那些昼夜颠倒、睡眠被切割成碎片、大脑因极度疲惫而停摆的日子里,新手父母面对的不仅仅是新生儿的啼哭,更是一场信息…...

使用Taotoken后如何清晰观测API用量与成本变化

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Taotoken后如何清晰观测API用量与成本变化 对于团队管理者或开发者而言,将大模型能力集成到产品中后,资…...

当1000A牵引电流遇上微安级信号:高铁轨道电路中扼流变压器的‘抗干扰’实战解析

高铁轨道电路中扼流变压器的抗干扰设计与工程实践 电气化铁路的轨道电路系统面临着前所未有的电磁兼容挑战——如何在承载1000A级牵引电流的钢轨上,同时可靠传输微安级的信号电流?这个看似矛盾的需求,正是现代高铁信号系统设计的核心难题之一…...

【独家首发】ElevenLabs中文语音优化白皮书:针对普通话声调、儿化音与连读现象的5层微调协议

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs超写实语音生成教程 ElevenLabs 是当前业界领先的 AI 语音合成平台,其模型在语调自然度、情感表达力与跨语言一致性方面表现卓越。本章将指导你完成从 API 接入到高质量语音生成的…...

LyricsX:一站式macOS歌词同步解决方案,让音乐体验更智能

LyricsX:一站式macOS歌词同步解决方案,让音乐体验更智能 【免费下载链接】LyricsX 🎶 Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是macOS平台上功能最全面的歌词同步工具&#xff…...

从平面到立体:ImageToSTL如何让任何图片在3分钟内变成立体可打印模型

从平面到立体:ImageToSTL如何让任何图片在3分钟内变成立体可打印模型 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from t…...

如何轻松解锁QQ音乐加密文件:qmcdump实战指南

如何轻松解锁QQ音乐加密文件:qmcdump实战指南 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/qm/qmcdump 你是否曾经下载…...

Windows 10/11下MySQL 8.0.28安装失败?‘服务没有响应控制功能’报错保姆级修复指南

Windows平台MySQL安装报错终极解决方案:从"服务无响应"到完美运行 遇到MySQL安装过程中弹出"服务没有响应控制功能"的红色报错窗口时,很多开发者第一反应是重装系统或更换数据库——别急!这个看似复杂的错误其实90%以上源…...