IO线程及相关函数

news2024/11/26 16:35:17
进程是资源分配的最小单位,线程是cpu调度的最小单位

一、概念:

线程指的是共享相同地址空间的多个任务

是一个轻量级的进程,为了提高系统的性能引入线程线程和进程都参与统一的调度

在同一个进程中创建的线程共享该进程的地址空间

有一个工厂,工厂里面有一个车间,车间里面有工人

有一个系统,系统里面有一个进程,进程里面有线程

供不应求:1.建一个车间,招一个工人

2.招工人

二、特点:

   1)由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大

   2)为了提高系统的性能,许多操作系统规范里引入了轻量级进程的概念,也被称为线程

   3)在同一个进程中创建的线程共享该进程的地址空间

   4)Linux里同样用task_struct来描述一个线程。线程和进程都参与统一的调度

 三、优点:

1)使用多线程的好处大大提高了任务切换的效率

2)多线程通信简单,可以通过全局变量

四、线程和进程的区别:

1)进程间相互独立,而同一个进程内的线程间共享进程内所有的资源

2)多线程间通信简单,但是需要对临界资源进行互斥与同步操作,多进程间通信较难

3)多线程安全性差,因为其中一个线程崩溃可能会对其他线程造成影响,多进程间相互独立,安全性高。

共性:都为操作系统提供了并发执行能力

不同点:调度和资源:线程是系统调度的最小单位,进程是资源分配的最小单位

地址空间方面:同一个进程创建的多个线程共享进程的资源;进程的地址空 间相互独立

通信方面:线程通信相对简单,只需要通过全局变量可以实现,但是需要考虑临界资

源访问的问题;进程通信比较复杂,需要借助进程间的通信机制(借助3g-4g内核空间)

安全性方面:线程安全性差一些,当进程结束时会导致所有线程退出;进程相对安全

临界资源:一次仅允许一个进程/线程访问的资源

临界区:访问临界资源的代码区域

安装:第三方库的man手册

sudo apt-get install manpages-posix manpages-posix-dev 

man pthread_create

  1. 线程资源

共享的资源:可执行的指令、静态数据、进程中打开的文件描述符、信号处理函数、当前工作目录、用户ID、用户组ID

  1. 私有的资源:线程ID (TID)、PC(程序计数器)和相关寄存器、堆栈、错误号 (errno)、信号掩码和优先级、执行状态和属性

五、线程函数

1、pthread_create

#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                  void *(*start_routine) (void *), void *arg);
功能:创建一个线程
参数:
1)tidp:事先创建好的pthread_t类型的参数。成功时tidp指向的内存单元被设置为新创建线程的线程ID。
2)attr:用于定制各种不同的线程属性。APUE的12.3节讨论了线程属性。通常直接设为NULL
3)start_rtn:新创建线程从此函数开始运行。无参数是arg设为NULL即可。
4)arg:start_rtn函数的参数。无参数时设为NULL即可。有参数时输入参数的地址。当多于一个参数时应当使用结构体传入。
返回值:成功返回0,失败非0.
  

进程退出所有线程都退出

向函数线程传递参数

2、pthread_exit 退出线程

#include <pthread.h>
void pthread_exit(void *retval);
功能:退出线程,由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,
参数:retval:线程退出时返回的值(通常为NULL
	返回值:成功 : 0
			失败:errno 
pthread_exit() 函数不能返回一个指向局部数据的指针,否则很可能使程序运行结果出错甚至崩溃。

只退出某一个线程

3、回收线程 pthread_join

#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
	功能:用于阻塞等待一个指定的线程结束
	参数:thread:创建的线程对象,线程标识符,即线程ID,标识唯一线程
		  retval:指针*retval指向线程返回的参数,用户定义的指针,用来存储被等待线程的返回值。
	返回值:成功 : 0
			失败:errno

补充:空类型二级指针不兼容其他类型二级指针,空类型一级指针兼容其他类型一级指针

注意函数内部的局部变量会随函数结束而销毁空间,用static修饰放到静态区,不随 函 数结束而销毁。

线程结束返回参数

4、获取线程tid   pthread_self

#include <pthread.h>
pthread_t pthread_self(void);
功能:获取线程tid
参数:无
返回值:成功得到线程tid,失败 错误码

  1. pthread_cancal在线程中发送关闭指定线程的请求

线程退出pthread_exit只能终止当前线程,也就是哪个线程调用了pthread_exit,哪个线程就会退出;但是线程取消pthread_cancel ,不光可以终止自己,还可以终止其他线程。

#include <pthread.h>
int pthread_cancel(pthread_t thread);
	功能: 在线程中发送关闭指定线程的请求
	参数:thread   要关闭的线程号
	返回值: 成功: 0
			 失败: 负数,更新 errno

6、将线程设置为游离态pthread_detach

#include <pthread.h>
int pthread_detach(pthread_t thread);
功能:从状态上实现线程分离,将线程设置为detach(游离态),线程退出由系统自动                回收线程资源,
无需使用pthread_join
参数:要操作的线程id
返回值:成功 0失败 错误码
    线程分离状态:
指定该状态,线程主动与主控线程断开关系。线程结束后(不会产生僵尸线程),其退出状态不由其他线程获取,而直接自己自动释放(自己清理掉PCB的残留资源)进程结束后,线程也会结束。
    与pthread_join不同的是不阻塞等待,子线程结束后自动回收,不影响我主线程的执行。datach不能接受退出进程的返回值

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

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

相关文章

预制菜配送小程序商城的效果如何

预制菜是近些年热度较高的新赛道&#xff0c;很多商家品牌入局&#xff0c;而投入到市场中也受到不少商家的喜欢&#xff0c;各种品牌和经销商层出不穷&#xff0c;目前各品牌主要以拓展市场和研究菜品为主&#xff0c;而线上无疑是很好的宣传销售渠道。 接下来让我们看看通过…

搭建gnn环境

1.无法激活 激活pytorch遇到报错usage: conda-script.py [-h] [--no-plugins] [-V] COMMAND ... conda-script.py: error: arg-CSDN博客 参考教程 【精选】手把手教你在windows10安装GNN相关环境&#xff08;torchtorch_geometricrdkitdeepchem&#xff09;_gnn环境相关的包-…

Docker Consul概述及构建

Docker Consul概述及构建 一、Consul概述1.1、什么是Consul1.2、consul 容器服务更新与发现1.3、服务注册与发现的含义1.4、consul-template概述1.5、registrator的作用 二、consul部署2.1、环境配置2.2、在主节点上部署consul2.3 、配置容器服务自动加入nginx集群2.3.1、安装G…

【Linux】:进程程序替换

进程程序替换 一.替换原理二.替换函数三.exec类函数 一.替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支)&#xff0c;子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全…

CleanMyMac X2024永久免费版mac电脑管家

日常使用中&#xff0c;很多用户忽略了Mac清除数据的重要性。当Mac运行速度越来越慢&#xff0c;发热严重&#xff0c;储存空间总是不足的时候&#xff0c;才意识到保持日常清理才是解决这些问题的根本。经常清理Mac&#xff0c;还有你意想不到的好处。 提高系统性能&#xff…

React-快速搭建开发环境

1.安装 说明&#xff1a;react-excise-01是创建的文件名 npx create-react-app react-excise-01 2. 打开文件 说明:we suggest that you begin by typing:下面即是步骤。 cd react-excise-01 npm start 3.显示

HIT_OS_LAB1 调试分析 Linux 0.00 引导程序

操作系统实验一 姓名&#xff1a;董帅学号&#xff1a;2021111547班级&#xff1a;21R0312 1.1 实验目的 熟悉实验环境掌握如何手写Bochs虚拟机的配置文件掌握Bochs虚拟机的调试技巧掌握操作系统启动的步骤 1.2 实验内容 1.2.1 掌握如何手写Bochs虚拟机的配置文件 boot: f…

拉扎维模拟CMOS集成电路设计西交张鸿老师课程P10~13视频学习记录

--------------------------------------------------------------------------------------------------------------------------------- p10 短沟道&#xff0c;除了沟长调&#xff0c;还可能出现速度饱和问题&#xff1b; 但是在拉扎维这本书里面没有考虑这个问题&#…

python随手小练12(南农作业题)

题目&#xff1a; 设有四个字母:a bcd,能组成多少个互不相同且无重复数字的三个字母的单词?各是什么? 解题思路:遍历全部可能的组合,把有重复的删除 具体操作&#xff1a; total 0 s [0, a, b, c, d] #注意&#xff1a;不能写成[0, a, b, c, d] for i in range(1, 5): …

为什么数组的下标是从0开始呢?

我们在许多的编程语言中&#xff0c;大部分的数组下标都是从零开始的&#xff0c;那为什么不是从一开始的呢&#xff1f; 首先我们&#xff0c;先要了解数组相关的定义。 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一…

关于FTP的一些往事

公司每天都要从美国的服务器下载大量的语音文件。然后根据语音的内容完成相关的医疗报告。不同语音的实时性要求是不一样的&#xff0c;有些要求6小时内完成&#xff08;TAT6&#xff09; &#xff0c;有些则是12小时。中美之间的网速又特别慢&#xff0c;所以&#xff0c;如何…

计算机网络基础三

课程目标 理解路由表的作用 能够读懂路由表信息 能够使用图形抓包工具 wireshark 进行数据包的抓取 &#xff0c;如&#xff08; TCP/IP 的三次握手四次断开&#xff09; 一、路由表 思考&#xff1a; 什么是交换,什么是路由,什么是路由表&#xff1f;1. 交换是指同网络访…

在vscode中运行c++代码,windows 11系统

缘起 工作中用mac电脑&#xff0c;装了vscode和c&#xff0c;在家里的windows电脑上&#xff0c;也想运行vscode&#xff0c;这时候就遇到问题了。现在将问题解决方案记录下来&#xff0c;以供参考。 解决方案 开始比较懒&#xff0c;直接百度一下&#xff0c;找了几篇文章&…

高阶数据结构学习 —— 图(1)

文章目录 1、并查集2、了解图3、邻接矩阵4、压缩路径5、基本概念6、邻接表 1、并查集 并查集是一个森林&#xff0c;是由多棵树组成的。这相当于整套数据&#xff0c;分成多个集合。查找有交集的集合们&#xff0c;会把它们合并起来&#xff0c;所以叫并查集。 一开始拿到的是…

idea上怎么将新创建项目转为maven项目

场景 在刚创建的一个项目中&#xff0c;往往没有被识别为maven项目&#xff0c;怎么做呢&#xff1f; 方法 然后选maven&#xff0c;这样这个项目就变成了maven项目

计数排序——不用比较的排序

原理&#xff1a; 代码&#xff1a; void CountSort(int* a, int n) {int max a[0];int min a[0];for (int i 0; i < n; i){if (a[i] > max){max a[i];}if (a[i] < min){min a[i];}}int grang max - min 1;int* count (int*)malloc(sizeof(int) * grang);me…

【SpringBoot】Docker部署

docker部署是主流的部署方式&#xff0c;极大的方便了开发部署环境&#xff0c;保持了环境的统一&#xff0c;也是实现自动化部署的前提。 1 项目的目录结构 package: 点击打包&#xff0c;生成 xxx-SNAPSHOT.jar target目录: 打包生成目录&#xff0c;生成的jar存放位置Docke…

Leetcode—2558.从数量最多的堆取走礼物【简单】

2023每日刷题&#xff08;十二&#xff09; Leetcode—2558.从数量最多的堆取走礼物 大顶堆实现代码 void swap(int *a, int *b) {int tmp *a;*a *b;*b tmp; }void downAdjustHeap(int *heap, int low, int high) {int i low;int j 2 * i 1;while(j < high) {if(j …

项目部署之OpenResty

项目部署之OpenResty 1. OpenResty介绍 OpenResty 是一个基于Nginx的高性能Web平台&#xff0c;用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。具备下列特点&#xff1a; 具备Nginx的完整功能基于Lua语言进行扩展&#xff0c;集成了大量精良…

单调队列和单调栈

单调队列 这种涉及到维护子数组的最大/小值的操作&#xff0c;一般都会是 1 剑指 Offer 59 - II. 队列的最大值 2 239. 滑动窗口最大值 3 1438. 绝对差不超过限制的最长连续子数组 单调栈