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

7. 线程编程(线程概念和创建)

线程的创建#include pthread.hint pthread_create(pthread_t *thread, constpthread_attr_t *attr, void *(*routine)(void *), void *arg);成功返回0失败时返回错误码thread 线程对象attr 线程属性NULL代表默认属性routine 线程执行的函数arg 传递给routine的参数 参数是void * 注意传递参数格式编译错误分析1.createP_t.c:14:36: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [-Wincompatible-pointer-types]ret pthread_create(tid,NULL,testThread,NULL);^In file included from createP_t.c:1:0:/usr/include/pthread.h:233:12: note: expected ‘void * (*)(void)’ but argument is of type ‘int * ()(char *)’意义表示pthread_create参数3的定义和实际代码不符合期望的是void * (*)(void) 实际的代码是int * ()(char)解决方法改为pthread_create(tid,NULL,(void)testThread,NULL);createP_t.c:(.text0x4b)对‘pthread_create’未定义的引用collect2: error: ld returned 1 exit status --------这个链接错误表示pthread_create这个函数没有实现解决方法编译时候加 -lpthread注意事项1. 主进程的退出它创建的线程也会退出。线程创建需要时间如果主进程马上退出那线程不能得到执行获取线程的id通过pthread_create函数的第一个参数通过在线程里面调用pthread_self函数线程间参数传递重点难点编译错误createP_t.c:8:34: warning: dereferencing ‘void *’ pointerprintf(“input arg%d\n”,(int)*arg);^createP_t.c:8:5: error: invalid use of void expressionprintf(“input arg%d\n”,(int)arg);错误原因是void类型指针不能直接用取值arg因为编译不知道数据类型。解决方法转换为指定的指针类型后再用取值 比如(int *)arg通过地址传递参数注意类型的转换值传递这时候编译器会告警需要程序员自己保证数据长度正确运行错误*** stack smashing detected ***: ./mthread_t terminated已放弃 (核心已转储)原因栈被破坏了数组越界线程的回收使用pthread_join 函数#include pthread.hint pthread_join(pthread_t thread, void **retval);注意pthread_join 是阻塞函数如果回收的线程没有结束则一直等待编译错误pjoin.c:13:5: error: unknown type name ‘pthead_t’pthead_t tid;错误类型未知的类型pthead_t错误可能1拼写错误2对应的头文件没有包含pjoin.c:18:12: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘void’ [-Wformat]printf(“thread ret%s\n”,retv);错误类型参数不匹配期望的是char * 但参数retv是void *解决在参数前面加强制类型转换charretv使用线程的分离两种方式1 使用pthread_detach2 创建线程时候设置为分离属性pthread_attr_t attr;pthread_attr_init(attr);pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED);#includepthread.h#includestdio.h#includeunistd.h// 子线程函数void*func(void*arg){printf(This is child thread\n);while(1){sleep(5);// 这是一个「取消点」}pthread_exit(thread return);// 这行永远不会执行}intmain(){pthread_ttid;void*retv;inti;pthread_create(tid,NULL,func,NULL);// 创建子线程sleep(5);// 主线程等 5 秒让子线程先运行pthread_cancel(tid);// 发送取消请求给子线程pthread_join(tid,retv);// 等待子线程结束并获取退出状态printf(thread ret%s\n,(char*)retv);// 打印子线程的返回值while(1){// 主线程死循环保持程序运行}}核心结论主线程睡 5 秒 ≠ 子线程刚好睡完 5 秒它们是同时、并行在跑的不是等一个跑完再跑另一个我给你画一个绝对清晰的时间轴时间单位秒0 秒时刻主线程创建子线程子线程立刻开始运行打印一句话马上进入 sleep(5)主线程创建完线程立刻也进入 sleep(5)两个人同时开始睡觉1 秒子线程还在睡主线程还在睡2 秒都在睡3 秒都在睡4 秒都在睡5 秒 关键主线程睡醒了主线程立刻执行pthread_cancel(tid)发送取消信号而此时子线程的 sleep(5) 也刚好 5 秒到了准备醒来最关键的瞬间谁先动子线程在第 5 秒结束时要做的第一件事从 sleep(5) 中醒来 → 检查取消请求主线程在第 5 秒结束时做的事发送取消请求结果子线程刚要醒来就发现“哦有人取消我了”→ 直接在sleep(5)这个取消点被杀死。用一句人话总结主线程和子线程是同时睡觉的5 秒后一起醒。主线程一醒就发取消信号子线程一醒就检查信号直接被杀死。所以子线程根本没机会跳出 while 循环也没机会执行下一轮代码。你担心的误区是这样的错误理解❌ 错误时间线子线程先跑sleep(5)等子线程睡完 5 秒主线程才开始 sleep(5)主线程睡醒才取消这完全错了线程是并发的不是排队执行的再验证一下如果把代码改成这样子线程就不会被取消// 子线程while(1){// 没有任何取消点纯计算inta0;a;}这种情况下主线程取消也没用因为没有取消点可以检查信号。最终总结主线程和子线程是同时运行的它们同时开始 sleep(5)5 秒后同时醒来子线程刚从 sleep 醒来取消点就被主线程发的取消信号杀死所以子线程永远死在 sleep(5) 这里线程的取消意义随时杀掉一个线程int pthread_cancel(pthread_t thread);注意线程的取消要有取消点才可以不是说取消就取消线程的取消点主要是阻塞的系统调用运行段错误调试可以使用gdb调试使用gdb 运行代码gdb ./youapp(gdb) run等待出现Thread 1 “pcancel” received signal SIGSEGV, Segmentation fault.输入命令bt打印调用栈(gdb) bt#0 0x00007ffff783ecd0 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6#1 0x00007ffff78458a9 in printf () from /lib/x86_64-linux-gnu/libc.so.6#2 0x00000000004007f9 in main () at pcancel.c:21确定段错误位置是pcancel.c 21行如果没有取消点手动设置一个void pthread_testcancel(void);设置取消使能或禁止int pthread_setcancelstate(int state, int *oldstate);PTHREAD_CANCEL_ENABLEPTHREAD_CANCEL_DISABLE设置取消类型int pthread_setcanceltype(int type, int *oldtype);PTHREAD_CANCEL_DEFERRED 等到取消点才取消PTHREAD_CANCEL_ASYNCHRONOUS 目标线程会立即取消线程的清理必要性 当线程非正常终止需要清理一些资源。void pthread_cleanup_push(void (*routine) (void *), void *arg)void pthread_cleanup_pop(int execute)routine 函数被执行的条件被pthread_cancel取消掉。执行pthread_exit非0参数执行pthread_cleanup_pop()注意必须成对使用即使pthread_cleanup_pop不会被执行到也必须写上否则编译错误。2.pthread_cleanup_pop()被执行且参数为0pthread_cleanup_push回调函数routine不会被执行.3 pthread_cleanup_push 和pthread_cleanup_pop可以写多对routine执行顺序正好相反线程内的return 可以结束线程也可以给pthread_join返回值但不能触发pthread_cleanup_push里面的回调函数所以我们结束线程尽量使用pthread_exit退出线程。

相关文章:

7. 线程编程(线程概念和创建)

线程的创建 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*routine)(void *), void *arg); 成功返回0&#xff0c;失败时返回错误码 thread 线程对象 attr 线程属性&#xff0c;NULL代表默认属性 routine 线程执行…...

docker、harbor、jenkins概念

一、docker 1、docker是什么&#xff1f; &#xff08;1&#xff09;docker是一个的【工具软件】&#xff08;就像微信、VS Code、浏览器&#xff09;&#xff0c;运行在你的电脑 / 服务器上。 &#xff08;2&#xff09;「Docker 是造镜像、跑容器的工具」 2、docker可以用来做…...

【SpringBoot 3.x 第202节】微服务拆分方法论:什么时候该拆,什么时候不该拆?

&#x1f3c6;本文收录于《滚雪球学SpringBoot 3.x》&#xff0c;专门攻坚指数提升&#xff0c;本年度国内最系统最专业最详细&#xff08;永久更新&#xff09;。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容&#xff0c;&#x1f680;均为全网独家首发…...

基于STM32H750XBH6开发板调试LwIP裸机程序

目录 1 前言 2 正点原子STM32H750XBH6阿波罗开发板介绍 3 配置和调试 3.1 CubeMX配置 3.2 代码修改 1 前言 LwIP 是物联网 / 嵌入式领域使用最广的开源 精简版TCP/IP 协议栈,STM32、ESP32、国产 MCU 全都用它,对于嵌入式 / 物联网初学者来说,亲手调试 LwIP 裸机程序(无操作…...

在fnOS飞牛NAS上部署宝塔+NocoBase低(零)代码平台的方法

在fnOS飞牛NAS上部署宝塔NocoBase低&#xff08;零&#xff09;代码平台的方法 温馨提醒&#xff1a;本文全文免费&#xff0c;严禁盗用、二次收费行为&#xff01; 更新日志&#xff1a; 2026/03/29 首次发布 2026/05/22 1、新增通过systemd托管进程&#xff0c;实现重启后自…...

Proteus 8.17安装超详细教程 保姆级教程【附安装包】

电子设计小伙伴们&#xff01;今天我给大家带来一篇超详细的Proteus 8.17专业版安装教程 &#xff01;这可是电子工程师和学生党的福音啊&#xff01;作为PCB设计和单片机仿真的神器&#xff0c;Proteus绝对是你玩转电子设计必备的利器&#xff01;不会安装&#xff1f;别担心&…...

SD-PPP:5分钟掌握Photoshop AI插件,让AI绘图更简单

SD-PPP&#xff1a;5分钟掌握Photoshop AI插件&#xff0c;让AI绘图更简单 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp SD-PPP是一款免费开源的Photoshop AI插件&#xff0c;它将Stable Diffusion等先进的AI绘图…...

KMS_VL_ALL_AIO:Windows与Office批量授权激活的终极技术解析与部署指南

KMS_VL_ALL_AIO&#xff1a;Windows与Office批量授权激活的终极技术解析与部署指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款基于KMS技术的智能激活脚本工具&#xf…...

跨平台串口调试终极指南:SSCom让硬件开发更简单

跨平台串口调试终极指南&#xff1a;SSCom让硬件开发更简单 【免费下载链接】sscom Linux/Mac版本 串口调试助手 项目地址: https://gitcode.com/gh_mirrors/ss/sscom 作为硬件开发的必备工具&#xff0c;串口调试工具SSCom凭借其跨平台特性和高效性能&#xff0c;为Lin…...

VideoDownloadHelper:智能视频下载解决方案,轻松保存网页视频资源

VideoDownloadHelper&#xff1a;智能视频下载解决方案&#xff0c;轻松保存网页视频资源 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 在当…...

OpenCore Legacy Patcher终极指南:三步让老Mac焕发新生,轻松运行最新macOS

OpenCore Legacy Patcher终极指南&#xff1a;三步让老Mac焕发新生&#xff0c;轻松运行最新macOS 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为老旧…...

混合基FFT,matlab实现

参考数字信号处理教程第四版&#xff08;程佩青著&#xff09;第四章FFT这里直接给出matlab函数&#xff0c;性能不保证最优注意&#xff0c;此函数只能处理混合基fft&#xff0c;即输入信号x的长度不能是素数&#xff0c;不能是2次幂整数function X mixedRadixFFT(x)% multiB…...

大牛直播SDK(SmartMediaKit)Windows平台多路RTSP转RTMP推流集成说明

文档概述 在安防监控、智慧园区、应急指挥、工业视觉、低空经济、无人机回传和多路摄像头上云等场景中&#xff0c;现场设备通常以 RTSP 方式输出视频流&#xff0c;而云端平台、直播分发平台或业务中台往往更倾向于接收 RTMP 流。此时&#xff0c;系统需要在边缘侧或 Windows…...

Keil MDK双J-Link并行调试实战指南

1. 双J-Link调试器并行使用场景解析在嵌入式开发过程中&#xff0c;我们经常会遇到需要同时调试多个目标板的情况。传统做法是频繁插拔调试器或使用调试器切换器&#xff0c;但这会显著降低开发效率。通过Keil MDK配合双J-Link调试器并行工作&#xff0c;可以完美解决这个痛点。…...

Poppins几何字体:如何让拉丁文与天城体在同一个视觉世界里和谐共舞?

Poppins几何字体&#xff1a;如何让拉丁文与天城体在同一个视觉世界里和谐共舞&#xff1f; 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 当你的产品需要同时面向印度用户和全…...

激光辅助侧信道攻击技术解析与应用

1. 激光辅助侧信道攻击技术概述在硬件安全研究领域&#xff0c;侧信道分析(Side-Channel Analysis, SCA)已经发展成为破解加密系统的重要手段。这种攻击方式不直接攻击算法本身的数学强度&#xff0c;而是通过测量设备运行时的物理特性变化&#xff08;如功耗、电磁辐射、时序等…...

工控行业IO信号Web监控平台原理及技术实现方案

本文从实际使用角度出发&#xff0c;意在解决行业系统中的IO信号监控痛点。一台设备的 IO 信号点动辄成百上千——从简单的门锁状态、急停按钮&#xff0c;到复杂的真空压力模拟量、主轴转速等。这些信号的实时监控直接关系到设备稼动率&#xff08;OEE&#xff09;和良品率&am…...

CTF 竞赛干货|50 个实战解题思路,收藏一篇就够用

CTF选手必藏的50个实战解题思路&#xff01;一篇够用&#xff01; CTF竞赛的核心逻辑 • 核心目标&#xff1a;快速拆解问题&#xff08;Flag导向&#xff09;、工具链协作、模式化思维。• 关键原则&#xff1a;先广度后深度&#xff08;优先收集信息&#xff09;、分治策略&…...

28 岁大专逆袭转行网络安全 资深前辈避坑忠告

网络安全行业 “人才缺口 300 万 、平均年薪超 25 万” 的红利&#xff0c;让无数职场人动了转行心思。尤其是学历普通&#xff08;如大专&#xff09;的群体&#xff0c;既面临原有岗位的天花板&#xff0c;又渴望通过技术转型实现薪资跃迁。但网安行业看似门槛低&#xff0c;…...

HarmonyOS 6学习:水平仪气泡移动方向错误的完整分析与修复方案

从"反向移动"到"精准指向"&#xff1a;一次完整的传感器应用开发经历在HarmonyOS 6应用开发中&#xff0c;我最近负责开发一个建筑工具应用&#xff0c;其中包含一个水平仪功能。这个功能对建筑工人和DIY爱好者来说非常实用——通过手机传感器检测设备倾斜…...

HarmonyOS 6学习:动画流畅与截图性能的双重优化实战

在HarmonyOS应用开发中&#xff0c;用户体验的流畅性往往取决于那些看似微小的细节。今天&#xff0c;我将带你探索两个看似无关却都深刻影响用户体验的技术问题&#xff1a;文字翻转动画的延迟卡顿和长截图生成的性能瓶颈。这两个问题分别代表了动画渲染和图像处理两个关键领域…...

VideoDownloadHelper终极指南:技术开发者必备的Chrome视频下载插件

VideoDownloadHelper终极指南&#xff1a;技术开发者必备的Chrome视频下载插件 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper VideoDownload…...

pprint,一个漂亮打印的 Python 库!

在日常编程中&#xff0c;我们经常需要打印复杂的数据结构——嵌套的字典、列表、JSON 响应、配置对象等。使用普通的 print() 会将整个结构挤在一行或简单换行&#xff0c;导致可读性极差&#xff0c;尤其是在调试多层嵌套的 API 返回数据时&#xff0c;简直是一场灾难。pprin…...

Navicat Mac版试用期重置终极指南:3种简单方法实现永久免费使用

Navicat Mac版试用期重置终极指南&#xff1a;3种简单方法实现永久免费使用 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 你…...

终极解决方案:三步彻底卸载Windows系统中顽固的Microsoft Edge浏览器

终极解决方案&#xff1a;三步彻底卸载Windows系统中顽固的Microsoft Edge浏览器 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRem…...

基于SpringCloud的微服务架构技术研究

随着互联网技术与校园信息化建设的快速发展&#xff0c;传统单体架构系统在业务迭代、功能扩展、并发处理与后期维护方面逐渐暴露出诸多短板。单体架构将所有业务逻辑、数据接口与功能模块耦合在同一个项目中&#xff0c;在系统体量较小、业务需求简单的场景下能够满足开发需求…...

终极免费Flash反编译工具:5分钟学会使用JPEXS拯救你的SWF资源

终极免费Flash反编译工具&#xff1a;5分钟学会使用JPEXS拯救你的SWF资源 【免费下载链接】jpexs-decompiler JPEXS Free Flash Decompiler 项目地址: https://gitcode.com/gh_mirrors/jp/jpexs-decompiler 你是否曾遇到过这样的困境&#xff1f;多年前制作的Flash动画文…...

XUnity Auto Translator:Unity游戏自动翻译的终极完整指南

XUnity Auto Translator&#xff1a;Unity游戏自动翻译的终极完整指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity Auto Translator是一款功能强大的开源游戏翻译工具&#xff0c;专为Unity引擎…...

如何高效实现Android Studio中文界面革命性升级

如何高效实现Android Studio中文界面革命性升级 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 你是否曾经因为Android Studio的英…...

魔兽争霸III终极优化指南:7大核心功能让经典游戏重获新生

魔兽争霸III终极优化指南&#xff1a;7大核心功能让经典游戏重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸III》在现代电脑…...