Linux 操作系统线程1

目录

一、线程

1.1线程的基本概念

1.2 线程相关的API函数

1.2.1  线程的创建

1.2.2  线程退出

1.2.3  线程等待函数

1.2.4  获取线程ID

1.2.5 线程取消

1.2.6 线程的清理函数


一、线程

1.1线程的基本概念

线程是属于进程;一个进程可以有多个线程;

线程的作用就是:解决多任务并发运行

进程和线程的区别:
        1.和进程相比, 它是一种非常“节俭” 的多任务操作方式( 启动一个进程所花费的空间
远远大于启动一个线程所花费的空间( 30 倍左右) , 而且, 线程间彼此切换所需的时间也远小于进程间切换所需要的时间( >10 倍) ) 。 在 linux 系统中建立一个新的进程必须分配给它独立的地址空间, 建立众多的数据表来维护它的代码段、 堆栈段和数据段等。 而运行于同一个进程的多个线程, 它们之间使用相同的地址空间, 而且线程间彼此切换所需的时间也远小于进程间切换的时间。

        2.线程间方便的通信机制。 对于不同进程,它们有独立的数据空间 数据的交互只能使
用进程通信 的方式, 这种方式费时, 而且不方便。 但是同一个进程下的线程之间共享数据空间, 所以一个线程的数据可 以直接为其他线程所有, 快捷, 方便。

线程的缺点:一个线程的非正常死亡,会导致进程退出,进而所有的线程均会死亡。

线程和进程在使用上各有优缺点:

        线程执行开销小, 占用的 CPU 资源少, 线程之间的切换快,但不利于资 源的管理和保护; 而进程正相反。 从可移植性来讲, 多进程的可移植性要好些。 要注意的是 由于线程共享了进 程的资源和地址空间, 因此, 任何线程对系统资源的操作都会给其他线程带来影响, 同时编写多线程程序, 最复 杂的事情是处理好各线程对共享资源的访问控制。

如何选择使用进程和线程:

        1) 需要频繁创建销毁的优先用线程,因为对进程来说创建和销毁一个进程代价是很大的。
        2)线程的切换速度快, 所以在需要大量计算, 切换频繁时用线程, 还有耗时的操作使用线程可高应用程序的响应;
        3) 强相关的处理用线程, 弱相关的处理用进程;
        4) 因为对 CPU 系统的效率使用上线程更占优, 所以可能要发展到多机分布的用进程, 多核分用线程;
        5) 需要更稳定安全时, 适合选择进程; 需要速度时, 选择线程更好。
        6) 如果线程和进程都各有优势和劣势, 选你喜欢的/你擅长的

1.2 线程相关的API函数

在wubantul inux操作系统上使用线程库函数需要进行调用,

gcc main -o main -lpthread

1.2.1  线程的创建

头文件:#include<pthread.h>

函数原型:

int pthread_create(pthread_t *restrict_thread, //线程号 %luconst pthread_attr_t *restrict_attr, //NULLvoid *(*start_routine)(void*), //函数指针, 传函数名即可void *restrict arg); //传给上一个参数的参数

参数:

        线程ID  //unsigned long

        线程属性  //  NULL

        线性入口函数

        传递给线程入口函数的参数

返回值:

成功返回0    失败返回错误号(非0)

1.2.2  线程退出

头文件:#include<pthread.h>

函数原型:

void pthread_exit(void *value_ptr);

参数:保存线程退出的状态

1.2.3  线程等待函数

头文件:#include<pthread.h>

函数原型:

int pthread_join(pthread_t thread, void **value_ptr);

作用:等待指定的线程退出,该函数是一个阻塞函数,一直等到参数pthid指定的线程返回;与多进程中的wait 或 waitpid 类似

参数:

要等待的线程ID

保存线程退出的状态 一般指定NULL

返回值:成功返回0,失败返回非0

1.2.4  获取线程ID

函数原型:

pthread_t pthread_self(void)

返回值:线程号,不同的线程有不同的线程号,但是线程号是相同的

1.2.5 线程取消

作用:取消一个还没有运行完的线程

函数原型:

int pthread_cancel(pthread_t thread);

参数:thread: 线程号

1.2.6 线程的清理函数

作用:有时候希望线程退出时能自动的执行某些函数

函数原型:

void pthread_cleanup_push(void (*routine)(void*), void *arg); 是清理注册函数
void pthread_cleanup_pop(int execute);是执行函数, 只有里面的参数 execute=1 才会执行

注意:这两个函数都是成双成对出现的,不能单独使用。

参数:

        routine: 注册清理的函数的指针
        arg: 传递给清理函数的参数
        execute: 决定这个清理函数是否被调用
        有三种情况线程清理函数会被调用:
                线程还未执行 pthread_cleanup_pop 前, 被 pthread_cancel 取消
                线程还未执行 pthread_cleanup_pop 前, 主动执行 pthread_exit 终止
                线程执行 pthread_cleanup_pop, 且 pthread_cleanup_pop 的参数为 1

线程的清理函数中的顺序和栈一样,满足先后出。

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

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

相关文章

动手学机器学习15 实战kaggle比赛

动手学机器学习15 实战kaggle比赛 1. 实战kaggle比赛&#xff1a;预测房价代码结果 2. 课程竞赛&#xff1a;加州2020年房价预测3. QA4. 用到的代码1. hashlib.sha1()2. sha1.update(data)3. train_data.iloc4. fillna(0)5. pd.get_dummies(&#xff09;6. nn.MSELoss()7. torc…

CTF-Web Exploitation(持续更新)

CTF-Web Exploitation 1. GET aHEAD Find the flag being held on this server to get ahead of the competition Hints Check out tools like Burpsuite to modify your requests and look at the responses 根据提示使用不同的请求方式得到response可能会得到结果 使用…

SpringBoot 扩展篇:ConfigFileApplicationListener源码解析

SpringBoot 扩展篇&#xff1a;ConfigFileApplicationListener源码解析 1.概述2. ConfigFileApplicationListener定义3. ConfigFileApplicationListener回调链路3.1 SpringApplication#run3.2 SpringApplication#prepareEnvironment3.3 配置environment 4. 环境准备事件 Config…

泛域名SSL证书购买攻略!

购买泛域名证书&#xff08;也称为通配符证书&#xff09;通常涉及以下几个步骤&#xff1a; 1. 选择证书提供商&#xff1a; 首先&#xff0c;你需要选择一个信誉良好的SSL证书提供商&#xff0c;如 Sectigo、GlobalSign、DigiCert 或者JoySSL。部分云服务提供商如华为云也提供…

OceanBase开发者大会实录:SaaS 场景降本50%!石基零售应用 OB Cloud 实践

本文来自2024 OceanBase开发者大会&#xff0c;石基零售助理总裁 、 ROC 产品事业部负责人陈亮的演讲实录—《石基零售与 OB Cloud 零售行业应用实践》。完整视频回看&#xff0c;请点击这里&#xff1e;> 大家下午好&#xff01;我是石基零售的陈亮。今天和大家分享一下石基…

Windows如何安装hadoop

var code "da0f4508-813e-4f6c-b5e8-6c19f92be6d1"Hadoop是一个开源的分布式计算平台&#xff0c;旨在处理大规模数据的存储和处理。它提供了分布式文件系统&#xff08;HDFS&#xff09;和分布式计算框架&#xff08;MapReduce&#xff09;&#xff0c;使得用户能够…

斯坦福大学的在线密码学课程

密码学是保护计算机系统信息不可或缺的工具。在本课程中&#xff0c;您将了解密码系统的内部工作原理&#xff0c;以及如何在实际应用中正确使用它们。课程首先将详细讨论当强大的对手窃听和篡改流量时&#xff0c;拥有共享密钥的双方如何进行安全通信。我们将研究许多已部署的…

10. Django Auth认证系统

10. Auth认证系统 Django除了内置的Admin后台系统之外, 还内置了Auth认证系统. 整个Auth认证系统可分为三大部分: 用户信息, 用户权限和用户组, 在数据库中分别对应数据表auth_user, auth_permission和auth_group.10.1 内置User实现用户管理 用户管理是网站必备的功能之一, D…

Study--Oracle-01-单实例部署Oracle11G-R2

Oracle版本发布介绍 Oracle 19c和12c和11g功能区别_数据库_oracle_支持 一、CentOS 7 环境准备 1、软件准备 操作系统&#xff1a;CentOS 7 数据库版本: Oracle11g R2 2、操作系统环境配置 关闭selinux &#xff0c;编辑 /etc/selinux/config文件&#xff0c;设置SELINU…

GRU模块:nn.GRU层

摘要&#xff1a; 如果需要深入理解GRU的话&#xff0c;内部实现的详细代码和计算公式就比较重要&#xff0c;中间的一些过程及中间变量的意义需要详细关注。只有这样&#xff0c;才能准备把握这个模块的内涵和意义&#xff0c;设计初衷和使用方式等等。所以&#xff0c;仔细研…

特征提取与深度神经网络(角点检测)

图像特征概述 图像特征表示是该图像唯一的表述&#xff0c;是图像的DNA HOG HOG &#xff08;Histogram of Oriented Gradients&#xff09;是一种用于目标检测的特征描述子。在行人检测中用的最多。HOG特征描述了图像中局部区域的梯度方向信息&#xff0c;通过计算图像中各个…

【爬虫】爬取股票历史K线数据写入数据库(三)

前几天有写过两篇&#xff1a; 【爬虫】爬取A股数据写入数据库&#xff08;二&#xff09; 【爬虫】爬取A股数据写入数据库&#xff08;一&#xff09; 现在继续完善&#xff0c;分析及爬取股票的历史K线数据通过ORM形式批量写入数据库。 2024/05&#xff0c;本文主要内容如下…