linux操作系统之线程

  • 1.线程概念

    • 线程是一个轻量级进程,每一个线程都属于一个进程

    • 进程是操作系统资源分配的最小单位,而线程是CPU任务调度的最小单位

    • 线程是一个任务执行的过程,包括创建,调度,消亡

      • 创建:线程空间位于进程空间,进程中的线程,栈区独立,并共享进程中的数据区,文本区,堆区

      • 调度:宏观并行,微观串行,与进程调度保持一致

      • 消亡:线程结束后,需要回收线程空间

  • 2.多线程与多进程区别

    • 执行效率:多线程执行效率高,创建速度快,任务切换快, 多进程效率低;

    • 通信:线程可以共享空间,直接通信(可以使用全局变量), 进程空间独立,不能直接通信(通信必须使用:管道,信号,共享内存...)

    • 安全性:多线程不安全(一个进程异常结束可能会导致进程结束,使其他的线程无法执行)

    • 资源消耗:相比于进程,线程的内存消耗通常会更小,因为线程共享进程的大部分内存空间和资源

  • 3.线程实现接口

    • 线程库

      • pthread_create

        • int pthread_create(pthread_t *thread,const pthread_attr_t *attr,void *(*start_routine),(void *), void *arg);

        • 创建一个线程

          • 注意:一次pthread_create执行只能创建一个线程, 每个进程至少有一个线程称为主线程,主进程退出则所有创建的子线程都退出,主线程必须有子线程同时运行才算多线程程序,线程id是线程的唯一标识,是CPU维护的一组数字。

          • 参数:thread:存放线程ID空间首地址,attr:线程的属性(默认NULL),start_routine:线程入口函数地址(函数指针,指向线程任务函数),arg:给线程函数的参数

      • pthread_self

        • pthread_t pthread_self(void);

          • 获取当前线程的线程id

      • pthread_exit

        • void pthread_exit(void *retval);

          • 子线程自行退出

            • 参数: retval 线程退出时候的返回状态,临死遗言。(不能是局部变量的地址)

      • pthread_join

        • int pthread_join(pthread_t thread, void **retval);

          • 通过该函数可以将指定的线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞

            • 参数:thread 要回收的子线程tid,retval 要回收的子线程返回值/状态

      • pthread_cancel

        • int pthread_cancel(pthread_t thread);

          • 请求结束一个线程

            • 参数:thread 请求结束一个线程tid

  • 4.线程属性

    • 1.可结合性

      • 能被其他线程回收和杀死的线程具有可结合性,在没有被其他线程回收之前,其资源不释放;

      • 使用pthread_join()函数回收,线程默认具有可结合性

    • 2.分离属性

      • 不能被其他线程回收或杀死的线程具有分离属性,其存储资源在终止时被系统自动释放(类似于孤儿进程)

      • 线程结束后空间自动被操作系统回收,无需调用回收线程的接口函数

      • 线程无法在线程结束实现同步,无法回收线程结束状态

      • 设置分离属性,目的线程消亡,自动回收空间

      • int pthread_attr_init(pthread_attr_t *attr);

        • 功能:初始化一个attr的变量

      • int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);

        • 功能:把一个线程设置成相应的属性

        • attr,属性变量,有init函数初始化

        • PTHREAD_CREATE_JOINABLE:可结合性

        • PTHREAD_CREATE_DETACHED:设置分离属性

      • pthread_attr_destroy

        • int pthread_attr_destroy(pthread_attr_t *attr);

          • 销毁线程属性

  • 5.线程控制

    • 互斥

      • 互斥机制:

        • 互斥机制 ===》互斥锁 ===》解决多线程操作共享空间引发的资源竞争问题。

        • 在多线程中对临界资源的排他性访问。

      • 多个线程在操作临界资源时存在资源竞争问题;

      • 临界资源:多个线程可以同时访问到的资源,如:共享变量,全局变量,共享内存等。。。

      • pthread_mutex_t mutex;

      • 初始化锁

        • int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex attr_t *attr);

          • 将已经定义好的互斥锁初始化。

      • 加锁

        • int pthread_mutex_lock(pthread_mutex_t *mutex);

          • 用指定的互斥锁开始加锁代码

          • 加锁后的代码到解锁部分的代码属于原子操作,在加锁期间其他进程/线程都不能操作该部分代码,如果该函数在执行的时候,mutex已经被其他部分使用则代码阻塞

      • 解锁

        • int pthread_mutex_unlock(pthread_mutex_t *mutex);

          • 将指定的互斥锁解锁,解锁之后代码不再排他访问,一般加锁解锁同时出现。

      • 销毁

        • int pthread_mutex_destroy(pthread_mutex_t *mutex);

          • 使用互斥锁完毕后需要销毁互斥锁

    • 同步

      • 有一定先后顺序的对资源的排他性访问。

        • 原因:互斥锁可以控制排他访问但没有次序。

      • 信号量的定义

        • sem_t sem;

      • 信号量的初始化

        • int sem_init(sem_t *sem, int pshared, unsigned int value);

          • 将已经定义好的信号量赋值,sem 为要初始化的信号量, pshared = 0 ;表示线程间使用信号量,!=0 ;表示进程间使用信号量,value 信号量的初始值,一般无名信号量

      • 信号量操作

        • 申请一个信号量

          • int sem_wait(sem_t *sem);

        • 释放一个信号量

          • int sem_post(sem_t *sem);

        • 信号量的销毁

          • int sem_destroy(sem_t *sem);

  • to be continue...

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

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

相关文章

常见的JS混淆及处理办法

1,变量名混淆 文本增添属性的过程中有很多操作空间 原始代码: s[age,job] function xx(){};xx.prototype[s[0]]15 xx.prototype[s[1]]teacheranew xx() 将属性名经过base64加密,并对函数名xx,,数组名s,经过混淆处理…

【网络安全的神秘世界】 文件上传及验证绕过

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 这个漏洞对于初学者好挖,先找到文件上传的位置 文件上传是web网页中常见的功能之一,通常情况下恶意文…

【数据结构初阶】一篇文章带你超深度理解【单链表】

hi ! 目录 前言: 1、链表的概念和结构 2、单链表(Single List,简写SList)的实现 2.1 定义链表(结点)的结构 2.2 创建一个链表 2.3 打印链表 2.4 尾插 2.5 头插 2.6 尾删 2.7 头…

python中argparse模块及action=‘store_true‘详解

1. 指定action时 通俗讲,action的作用就是在命令行中指定参数名称时,参数的取值。 如: parser.add_argument(--save-file, actionstore_true, defaultFalse, help是否保存文件) 给参数设置action之后,命令执行时,…

【BUG】已解决:You are using pip version 10.0.1, however version 21.3.1 is available.

You are using pip version 10.0.1, however version 21.3.1 is available. 目录 You are using pip version 10.0.1, however version 21.3.1 is available. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#…

数据结构初阶(C语言)-二叉树

一,树的概念与结构 树是⼀种非线性的数据结构,它是由 n(n>0) 个有限结点组成⼀个具有层次关系的集合。把它叫做树是因为它看起来像⼀棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有⼀个特殊的结点&a…

【Linux学习 | 第1篇】Linux介绍+安装

文章目录 Linux1. Linux简介1.1 不同操作系统1.2 Linux系统版本 2. Linux安装2.1 安装方式2.2 网卡设置2.3 安装SSH连接工具2.4 Linux和Windows目录结构对比 Linux 1. Linux简介 1.1 不同操作系统 桌面操作系统 Windows (用户数量最多)MacOS ( 操作体验好,办公人…

昇思25天学习打卡营第22天|基于MindNLP+MusicGen生成自己的个性化音乐

文章目录 昇思MindSpore应用实践1、MusicGen模型简介残差矢量量化(RVQ)SoundStreamEncodec 2、生成音乐无提示生成文本提示生成音频提示生成 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 1、MusicGen模型简…

python使用 tkinter 生成随机颜色

先看效果: 只要不停点击底部的按钮,每次都会生成新的颜色。炫酷啊。 import random import tkinter import tkinter.messagebox from tkinter import Button# todo """ 1. 设置一个按钮,来让用户选择是否显示颜色值 2. 把按钮换成 Label…

谷粒商城实战笔记-错误记录-启动失败

文章目录 一,lombok报错二,Output directory is not specified 一,lombok报错 java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled. Your processor is: com.sun.proxy.$Proxy8 Lombok …

初试Ollama本地大模型

准备工作 机器配置: CPUi5-10400内存16GB硬盘SSD 480GB显卡GTX 1660 系统:Ubuntu 18.04 Server NVIDIA驱动安装 - 下载 驱动下载地址:https://www.nvidia.cn/geforce/drivers/ - 获取下载链接 GTX 1660驱动下载链接:https://…

怎么理解FPGA的查找表与CPLD的乘积项

怎么理解 fpga的查找表 与cpld的乘积项 FPGA(现场可编程门阵列)和CPLD(复杂可编程逻辑器件)是两种常见的数字逻辑器件,它们在内部架构和工作原理上有着一些显著的区别。理解FPGA的查找表(LUT,L…

在 Android 上实现语音命令识别:详细指南

在 Android 上实现语音命令识别:详细指南 语音命令识别在现代 Android 应用中变得越来越普遍。它允许用户通过自然语言与设备进行交互,从而提升用户体验。本文将详细介绍如何在 Android 上实现语音命令识别,包括基本实现、带有占位槽位的命令处理,以及相关的配置和调试步骤…

力扣SQL50 指定日期的产品价格 双重子查询 coalesce

Problem: 1164. 指定日期的产品价格 coalesce 的使用 简洁版 &#x1f468;‍&#x1f3eb; 参考题解 select distinct p1.product_id,coalesce((select p2.new_pricefrom Products p2where p2.product_id p1.product_id and p2.change_date < 2019-08-16order by p2.…

黑马JavaWeb企业级开发(知识清单)03——HTML实现正文:排版(音视频、换行、段落)、布局标签(div、span)、盒子模型

文章目录 前言一、正文排版1. 视频标签: < video >2. 音频标签: < audio >3. 换行标签: < br >4. 段落标签 < p >5. vscode实现 二、布局1. 盒子模型2. 布局标签< div >和< span >3. VScode实现 三、源代码和运行结果总结 前言 本篇文章是…

uniapp bug解决:uniapp文件查找失败:‘uview-ui‘ at main.js:14

文章目录 报错内容解决方法main.js 文件中 uView 主 JS 库引入 uView 的全局 SCSS 主题文件内容修改引入 uView 基础样式内容修改配置 easycom 内容修改 报错内容 10:50:51.795 文件查找失败&#xff1a;uview-ui at main.js:14 10:59:39.570 正在差量编译... 10:59:43.213 文…

git的一些使用技巧(git fetch 和 git pull的区别,git merge 和 git rebase的区别)

最近闲来无聊&#xff0c;虽然会使用git操作&#xff0c;但是 git fetch 和 git pull 的区别&#xff0c;git merge 和 git rebase的区别只是一知半解&#xff0c;稍微研究一下&#xff1b; git fetch 和 git pull 的区别 git fetch git fetch 是将远程仓库中的改动拉到本地…

ARM架构(三)——AMBA和总线②

本文参考 ARM文档“Introduction to AMBA AXI4 - Arm Developer” 手册可以在ARM官方文档中下载ARM.con&#xff0c;也可以访问我的百度网盘资源 提取码&#xff1a;1234 目录 1. AXI协议概述1.1 多主系统中的AXI1.2 AXI通道1.3 AXI的主要特点 2. 通道传输和事务&#xff08; …

基础IO(重定向与缓冲区)

一、重定向 1、stat() 与 read() 函数 &#xff08;1&#xff09;stat() 函数 path&#xff1a;文件路径 buf&#xff1a;输出型参数&#xff0c;用于返回文件的各种属性。 函数成功返回 0 &#xff0c;失败返回 -1 &#xff08;2&#xff09;read() 函数 fd&#xff1a;文…

使用minio cllient(mc)完成不同服务器的minio的数据迁移和mc基本操作

minio client 前言使用1.拉取minio client 镜像2.部署mc容器3.添加云存储服务器4.迁移数据1.全量迁移2.只迁移某个桶3.覆盖重名文件 5.其他操作1.列出所有alias、列出列出桶中的文件和目录1.1.列出所有alias1.2.列出桶中的文件和目录 2.创建桶、删除桶2.1.创建桶2.2.删除桶 3.删…