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

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

什么是线程

线程的定义

        是轻量级的进程,可以实现多任务的并发。线程是操作系统任务调度的最小单位

线程的创建

        由某个进程创建,且进程创建线程时,会为其分配独立的栈区空间(默认8M)。线程和所在的进程,以及进程中的其他线程,共用进程的堆区、文本区、数据区

线程的调度

        宏观并行,微观串行

进程和线程的区别

进程线程
单位操作系统资源分配的最小单位操作系统任务调度的最小单位
资源消耗资源消耗开销大,每次创建都需要有0-4G的虚拟内存空间资源消耗开销较小,只需要由所在进程为其开辟默认8M的栈区空间
效率由操作系统创建,创建耗时大,跨进程调度慢由进程创建,创建耗时小,跨线程调度快
通信进程间不能直接通信,需要使用进程间通信机制(IPC)通信简单,可以使用线程共享的区域通信(例如全局变量)
安全性安全性较高,因为各个进程空间独立安全性较低,一个线程异常,可能影响同一进程中的线程

线程相关编程

        线程的创建:pthread_read();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,否则可能线程还未执行,进程就优先结束,连带着线程也结束

pthread_exit()

        功能:退出一个线程任务

        参数:向回收的线程传递的参数的地址,如果不传递参数则为NULL

        pthread_exit(NULL)等价于return NULL

pthread_join()

        功能:阻塞等待回收线程资源空间

        参数:要回收的线程ID;用来保存线程退出时传递的参数,NULL表示不接收传递的参数

        返回值:成功为0,失败为-1

线程属性

        1,分离属性:不需要被其他线程回收的线程,将来会被操作系统回收

        2,非分离属性:可以被其他线程回收或者结束的线程,默认属性为非分离属性

线程回收策略

        1,分离属性的线程:不需要回收(没有空闲的线程可以帮忙回收)

        2,调用pthread_join阻塞回收

int pthread_detach(pthread_t thread)

        功能:将线程设置成分离属性的线程

线程间通信

        临界资源:多个线程可以同时访问的资源,例如全局变量,共享内存区域

        然而,在多个线程在访问临界资源时,会存在资源竞争问题,如下

        如果按照代码正常思路,最后输出应该是200000,但是最后却输出199997,这是由于对于全局变量n,其中一个线程调用并进行操作,还未将结果重新赋予时,另一个线程也进行了调用,导致两个线程赋予了同一个值。

        事实上,数字越大越容易出现这种情况,但是并不代表每次运行都会出现这种情况,所以为了完全避免这种资源竞争问题,需要用到互斥机制

互斥机制

        互斥机制:多个线程访问临界资源时,具有排他性访问的机制,即一次只允许一个线程对该临界资源进行访问

        实现互斥机制的步骤

                1,创建互斥锁:pthread_mutex_t

                2,初始化互斥锁:pthread_mutex_init

                3,锁上: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

        所以上述的例子可改为

http://www.dtcms.com/a/336621.html

相关文章:

  • 基于飞算JavaAI实现高端算法性能优化:从理论到落地的性能跃迁实践
  • C++---迭代器删除元素避免索引混乱
  • 【Golang】:函数和包
  • 因果语义知识图谱如何革新文本预处理
  • os详解,从上面是‘os‘模块?到核心组成和常用函数
  • 智能合约里的 “拒绝服务“ 攻击:让你的合约变成 “死机的手机“
  • 什么是AI Agent(智能体)
  • nature子刊:MCNN基于电池故障诊断的模型约束的深度学习方法
  • [Oracle数据库] Oracle 多表查询
  • 网络常识-我的电脑啥时安装了证书
  • 生成模型实战 | InfoGAN详解与实现
  • java如何使用正则提取字符串中的内容
  • 谈谈对面向对象OOP的理解
  • 深入分析 Linux PCI Express 子系统
  • Highcharts 官方文档与 API 查询技巧解析
  • android aidl相关学习
  • 【昇腾】单张48G Atlas 300I Duo推理卡MindIE+WebUI方式跑14B大语言模型_20250817
  • 在鸿蒙中实现深色/浅色模式切换:从原理到可运行 Demo
  • 母猪姿态转换行为识别:计算机视觉与行为识别模型调优指南
  • redis和cdn的相似性和区别
  • 编程算法实例-最小公倍数
  • Python自学09-常用数据结构之元组
  • 黑马商城day08-Elasticsearch作业(个人记录、仅供参考、详细图解)
  • 嵌入式系统中的签名验证:设计与原理解析(C/C++代码实现)
  • Java基础Object中常见问题解析
  • Redis面试精讲 Day 24:Redis实现限流、计数与排行榜
  • 数字货币的法律属性与监管完善路径探析
  • SCAI采用公平发射机制成功登陆LetsBonk,60%代币供应量已锁仓
  • SpringBoot中,接口加解密
  • C语言课程开发