线程(基础概念)

news2024/10/6 6:23:55

文章目录

  • 一、线程和进程?
  • 二、线程初识
    • 2.1 线程属性
    • 2.2 线程的调度策略
    • 2.3 线程的优先级
    • 2.3 线程实验


一、线程和进程?

我们经常描述进程(process)和线程(thread): 进程是资源管理的最小单位,线程是程序执行的最小单位。从进程演化出线程,主要是因为进程拥有数据段、代码段、堆栈段,导致进程切换上下文开销大。在进程中创建一个新线程时,新的执行线程将拥有自己的栈, 但与它的创建者共享全局变量文件描述符信号处理函数当前目录状态。 也就是说,它只使用当前进程的资源,而不是产生当前进程的副本。

二、线程初识

2.1 线程属性

线程属性值有一个分离状态决定一个线程以什么样的方式来终止自己。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前, 它的存储器资源(如栈)是不释放的。一个分离的线程是不能被其他线程回收或杀死的, 它的存储器资源在它终止时由系统自动释放

进程中的线程可以调用pthread_join()函数来等待某个线程的终止,获得该线程的终止状态,并收回所占的资源, 如果对线程的返回状态不感兴趣,可以将rval_ptr设置为NULL

int pthread_join(pthread_t tid, void **rval_ptr);

我们如果不关心线程终止状态,可以将线程设置为分离状态,也可以让线程以分离状态启动

int pthread_detach(pthread_t tid);//将线程设置为**分离状态**
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);//让**线程以分离状态启动**

2.2 线程的调度策略

POSIX(Portable Operating System Interface)标准指定了三种调度策略:

  1. 分时调度策略,SCHED_OTHER。这是线程属性的默认值,另外两种调度方式只能用于以超级用户权限运行的进程, 因为它们都具备实时调度的功能,但在行为上略有区别。
  2. 实时调度策略,先进先出方式调度(SCHED_FIFO)。基于队列的调度程序,对于每个优先级都会使用不同的队列, 先进入队列的线程能优先得到运行,线程会一直占用CPU,直到有更高优先级任务到达或自己主动放弃CPU使用权。
  3. 实时调度策略 ,时间片轮转方式调度(SCHED_RR)。与 FIFO相似,不同的是前者的每个线程都有一个执行时间配额, 当采用SHCED_RR策略的线程的时间片用完,系统将重新分配时间片, 并将该线程置于就绪队列尾,并且切换线程,放在队列尾保证了所有具有相同优先级的RR线程的调度公平。

2.3 线程的优先级

在Linux系统中,优先级数值越小, 线程优先级越高。仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效, 并可以在运行时通过pthread_setschedparam()函数来改变,默认为0。

2.3 线程实验

实验中创建一个进程,线程的属性是默认属性,在线程执行完毕后就退出

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

/*要执行的线程*/
void *test_thread(void *arg)
{
    int num = (unsigned long long)arg; /** sizeof(void*) == 8 and sizeof(int) == 4 (64 bits) */

    printf("This is test thread, arg is %d\n", num);
    sleep(5);
    /*退出线程*/
    pthread_exit(NULL);
}


int main(void)
{
    pthread_t thread;
    void *thread_return;
    int arg = 520;
    int res;

    printf("start create thread\n");

    /*创建线程,线程为test_thread函数*/
    res = pthread_create(&thread, NULL, test_thread, (void*)(unsigned long long)(arg));
    if(res != 0)
    {
        printf("create thread fail\n");
        exit(res);
    }

    printf("create treads success\n");
    printf("waiting for threads to finish...\n");

    /*等待线程终止*/
    res = pthread_join(thread, &thread_return);
    if(res != 0)
    {
        printf("thread exit fail\n");
        exit(res);
    }

    printf("thread exit ok\n");

    return 0;
}

运行结果

在这里插入图片描述

以下是一些线程相关函数,创建一个线程

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

初始化线程对象的属性

int pthread_attr_init(pthread_attr_t *attr);

销毁一个线程属性对象

int pthread_attr_destroy(pthread_attr_t *attr);

设置、获取线程栈大小可以使用以下函数:

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
参数说明:

线程退出

void pthread_exit(void *retval);

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

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

相关文章

每天五分钟深度学习框架pytorch:tensor向量的统计函数的运算

本文重点 给定一个向量,我们如何才能获取到这个向量中重要的那部分呢?比如均值,最大值等等,我们可以使用pytorch中已经封装好的方法来完成这些任务。 常用的统计方法 L1范式 L1范式就是将向量中所有元素的绝对值相加求和,以上是对a、b、c三个向量求L1范式,都是8 L2范数…

GEE计算遥感生态指数RSEI

目录 RESI湿度绿度热度干度源代码归一化函数代码解释整体的代码功能解释:导出RSEI计算结果参考文献RESI RSEI = f (Greenness,Wetness,Heat,Dryness)其遥感定义为: RSEI = f (VI,Wet,LST,SI)式中:Greenness 为绿度;Wetness 为湿度;Thermal为热度;Dryness 为干度;VI 为植被指数…

QT5.12环境搭建与源码编译

一、概述 QT版本&#xff1a;QT5.12.10 Qt网址&#xff1a;http://download.qt.io/archive/qt/ 编译平台 ubuntu18.04 二、安装交叉编译工具链 1、获取交叉编译工具链 一般如果是编译系统如果有对应的gcc 就是用这个就可以了 比如rk3128 lin…

校园失物招领系统带万字文档java项目失物招领管理系统java课程设计java毕业设计springboot vue

文章目录 校园失物招领系统一、项目演示二、项目介绍三、万字字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 校园失物招领系统 一、项目演示 校园失物招领系统 二、项目介绍 语言: Java 数据库&…

【WebRTC实现点对点视频通话】

介绍 WebRTC (Web Real-Time Communications) 是一个实时通讯技术&#xff0c;也是实时音视频技术的标准和框架。简单来说WebRTC是一个集大成的实时音视频技术集&#xff0c;包含了各种客户端api、音视频编/解码lib、流媒体传输协议、回声消除、安全传输等。对于开发者来说可以…

【matlab】智能优化算法——求解目标函数

智能优化算法在求解目标函数方面发挥着重要作用&#xff0c;它通过迭代、筛选等方法来寻找目标函数的最优值&#xff08;极值&#xff09;。以下是关于智能优化算法求解目标函数的详细介绍&#xff1a; 一、智能优化算法概述 智能优化算法是一种搜索算法&#xff0c;旨在通过…

吴恩达机器学习 第三课 week2 推荐算法(下)

目录 01 学习目标 02 基于内容的过滤算法 03 实现“电影推荐系统” 3.1 问题描述 3.2 算法实现 04 大项目&#xff08;数据很大&#xff09;的推荐方法※ 4.1 方法原理 4.2 实施示例 05 总结 01 学习目标 &#xff08;1&#xff09;理解基于内容的过滤算法&#xff08…

模拟退火算法4—应用

TSP&#xff08;旅行商&#xff09;问题是最有代表性的优化组合问题之一&#xff0c;其应用已逐步渗透到各个技术领域和我们的日常生活中.它一开始是为交通运输而提出的&#xff0c;比如飞机航线安排、送邮件、快递服务、设计校车行进路线等等.实际上其应用范围扩展到了许多其他…

阿里模型调用体验

引言 随着人工智能技术的飞速发展&#xff0c;大型模型已成为推动技术进步的关键因素之一。阿里大模型作为国内领先的人工智能技术之一&#xff0c;其在多个领域的应用展示了强大的潜力。本文将通过调用案例&#xff0c;简单解析阿里大模型在特定场景中的应用及其效果。 1.导…

Aigtek高压功率放大器主要应用场景是什么

高压功率放大器是一种关键的电子设备&#xff0c;其主要功能是将低电压信号放大到较高电压水平&#xff0c;以满足特定应用的需求。这种类型的放大器在各种领域都发挥着至关重要的作用。安泰电子官网将为大家介绍高压功率放大器的主要应用场景&#xff0c;并介绍其在这些领域中…

Qt 网络编程实战

一.获取主机的网络信息 需要添加network模块 QT core gui network主要涉及的类分析 QHostInfo类 QHostInfo::localHostName() 获取本地的主机名QHostInfo::fromName(const QString &) 获取指定主机的主机信息 addresses接口 QNetworkInterface类 QNetworkInterfac…

《操作系统真象还原》学习笔记:第2章——编写MBR主引导记录

2.1 计算机的启动过程 载入内存&#xff1a; &#xff08;1&#xff09; 程序被加载器&#xff08;软件或硬件&#xff09;加载到内存某个区域 &#xff08;2&#xff09;CPU 的 cs:ip 寄存器被指向这个程序的起始地址 2.2 软件接力第一棒&#xff0c;BIOS 2.2.1 实模式下的…

78110A雷达信号模拟软件

78110A雷达信号模拟软件 78110A雷达信号模拟软件(简称雷达信号模拟软件)主要用于模拟产生雷达发射信号和目标回波信号&#xff0c;软件将编译生成的雷达信号任意波数据下载到信号发生器中&#xff0c;主要是1466-V矢量信号发生器&#xff0c;可实现雷达信号模拟产生。软件可模…

结构方程模型-验证性因子分析模型

初级 第7讲 验证性因子分析模_哔哩哔哩_bilibili

【matlab】【python】爬虫实战

目录 引言 具体步骤 1.设置请求选项 2.发送请求并获取响应 3.设置正则表达式 4.执行正则表达式匹配 matlab完整代码 python代码示例 引言 在当今这个信息爆炸的时代&#xff0c;数据已成为推动社会进步和企业发展的核心动力之一。随着互联网的普及和技术的飞速发展&am…

7.Android逆向协议-抓取安卓http和https数据包(设备需要root权限)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;微尘网校 上一个内容&#xff1a;6.Android逆向协议-配置FD抓包环境 root&#xff1a; 现在的安卓手机不好搞&#xff0c;有很多坑&am…

ECSNet: Spatio-Temporal Feature Learning for Event Camera

标题&#xff1a;ECSNet&#xff1a;事件相机的空间时间特征学习 源文&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9869656https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9869656 源码&#xff1a;GitHub - zhiwen-xdu/ECSNet…

AIGC为设计师解决了什么问题?

在当今数字化时代&#xff0c;设计师们面临着前所未有的挑战和压力。他们不仅要不断创新以满足市场和客户的需求&#xff0c;还要紧跟快速变化的设计趋势和技术发展的步伐。幸运的是&#xff0c;随着生成式人工智能&#xff08;AIGC&#xff09;的兴起&#xff0c;设计师们找到…

Prometheus安装部署

1 常见部署方式 包安装 RHEL系统: https://packagecloud.io/app/prometheus-rpm/release/search 二进制安装 https://prometheus.io/download/ 基于 Docker 运行 https://prometheus.io/docs/prometheus/latest/installation/ 1.1 Docker 镜像直接启动 [root120 ~]# d…

日志自动提取---七牛Logkit观星应急工具

目录 七牛Logkit (Windows&Linux&Mac 等) 下载: 文档: windows配置过程: 1-下载 2-修改logkit-community基本配置 3-启动! 4-浏览器访问 5-添加配置吧 观星应急工具 &#xff08;Windows 系统日志&#xff09; 七牛Logkit (Windows&Linux&Mac 等) -…