多线程概念,线程控制
文章目录
- 多线程
- 线程概念
- 多任务处理:
- 多线程/多进程进行多任务处理的优缺点分析
- 多线程的优点
- 多进程的优点
- 共同的优点
- 线程控制
- 线程的创建
- 线程的终止
- 线程的等待
- 线程的分离
多线程
线程概念
进行多任务处理
多任务处理:
多创建几个进程,一个进程就有一个pcb,能够串行化的完成一个任务,在一个进程创建多个pcb,因为pcb是调度程序运行的描述,因此有多少个pcb就会有多少个执行流程
多进程
多线程
最早的时候,进程就是一个pcb,操作系统通过pcb>实现调度管理;然而学习多线程,因为线程是进程中的一个执行流,并且这些pcb共用同一个虚拟地址,这些pcb更加轻量化,因此也被称为轻量级进程
在linux中,pcb就是调度程序运行的描述,一个pcb就可以调度一段程序的运行;
创建线程会伴随在内核中创建一个pcb来实现程序的调度,作为进程的一个执行流
进程就是多个线程的集合,并且这个进程中的所有pcb共用进程中的大部分资源(程序运行时,操作系统为程序所分配的所有资源)因此这些pcb在linux称为轻量级进程
线程间独有与共享
独有:栈,寄存器, 信号屏蔽字,errno,标识符,调度优先级
共有:虚拟地址空间,IO信息,信号处理方式,工作目录,用户ID/组ID
为什么信号是先注销在处理?
信号针对整个经常通知时间进行处理的,但是一个信号只需要被处理一次就够了;然而一个进程有可能使用vfork创建一个子进程;父子进程共用一个虚拟地址空间,但父进程会阻塞直到子进程exit或重新替换;
多线程/多进程进行多任务处理的优缺点分析
多线程的优点
1.线程间通信更加灵活方便(处理进程间通信方式还有全局变量以及函数传参----共用一个虚拟地址空间,只要知道地址就能访问同一块空间)
2.线程的创建与销毁成本更低(创建线程创建一个pcb,共用的数据只需要一个指针指向同一处就可以了)
3.同一个进程中的线程间调度成本更低(调度切换需要切换页表…)
多进程的优点
1.多进程的健壮性,稳定性更高(异常以及一些系统调用exit直接针对整个进程生效)
共同的优点
1.IO密集型程序:多任务并行处理
2.CPU密集型程序:程序中进行大量的数据运算处理;cpu资源足够,就可以同时处理,提高效率(通常执行流的个数是cpu核心数+1),创建线程很多的话,而cpu资源不够多,会造成进程切换调度成本提高。
线程控制
通过代码实现线程的创建/ 退出/ 等待/ 分离
使用库函数创建一个线程,本质上是在内核中创建一个轻量级进程来实现程序的调度
线程的创建
int pthread_creat(pthread_t* thread, const pthread_attr_t* attr, void*(start_routine)(void*), void* arg)
参数说明:
thread:输出型参数,用于获取线程id--线程的操作句柄
attr:线程属性,用于在创建线程的同时设置线程属性,通常置NULL
start_routine:函数指针,这就是一个线程的入口函数--线程运行的就是这个函数,函数运行完线程就会退出
arg:通过线程入口函数,传递给线程的参数
返回值:成功返回0;失败返回非0值--错误编号
#include<stdio.h>
#include<unistd.h> //sleep头文件
#include<string.h> //字符串操作头文件
#include<pthread.h> //线程库接口头文件
void* thr_strat(void* arg){while(1){printf("nihaoya~%s\n", (char*)arg);sleep(1);}return NULL;
}
int main(){pthread_t tid;char ptr[] = "shuilme";int ret = pthread_create(&tid, NULL, thr_strat, (void*)ptr);if(ret != 0){printf("create thread failed!\n");return -1;}printf("create thread success!\n");while(1){printf("hello~\n");sleep(1);}
}
pcb是一个无符号长整型数据
一个线程就有一个pcb,每一个pcb都有一个pid----pcb是一个整型数据
tid和pid有什么联系
tid ----是一个线程id,线程的操作句柄,准确的来说这个tid就是用户态线程的id,这个id其实就是线程独有这块空间的首地址
每个线程被创建出来之后,都会开辟一块空间,存储自己的栈,自己的描述信息
pid----是一个轻量级进程id内核中的task_struct结构体中的id
task_struct->pid:轻量级进程id,也就是ps -ef看到的LWP
task_struct->tgid: 线程组id,等于主线程id(也就是外边看到的进程id)
线程的终止
如何退出一个线程
1. 线程入口函数运行完毕后,线程就会自动退出----在线程入口函数中调用return(但是main中调用return,退出的是进程还不是主线程)
2.
void pthread_exit(void* retval);
退出线程接口- 谁调用谁退出,retval是退出返回值(exit函数无论在哪个进程调用,退出的都是整个进程)
主线程退出,并不会导致进程退出,只有所有的线程都退出了,进程才退出
3.
int pthread_cancel(pthread_t thread);
终止一个线程;退出的线程是被动取消的
线程的等待
等待一个线程的退出,获取退出线程的返回值,回收线程所占的资源
线程有一个属性,默认创建出来这个属性是joinable,处于这个属性的线程,退出后,需要被其它线程获取返回值回收资源
int pthread_join(pthread_t thread, void **retval)
----等待指定线程退出,获取返回值
参数列表:
thread:要等待退出的线程id
retval:输出型参数,用于返回线程的返回值
线程的分离
将线程joinable 属性改为detach 属性;
一个线程属性若是joinable 那么就必须被等待
一个线程属性若是detach那么这个线程退出后则自动释放资源,不需要被等待(因为资源已经自动释放了)
分离一个线程,一定是你对线程的返回值,不感兴趣,根本就不想获取,又不想一直等待
int pthread_deatch(pthread_t thread);
----将指定线程分离出去,属性改为detach
pthread_t pthread_self(void);
返回调用线程的tid
多线程概念,线程控制相关推荐
- Java笔记-多线程之线程控制
线程控制 我们已经知道了线程的调度,接下来我们就可以使用如下方法对象线程进行控制. 1.线程休眠 public static void sleep(long millis):让当前线程处于暂停状态,m ...
- Linux系统编程36:多线程之线程控制之pthread线程库(线程创建,终止,等待和分离)
文章目录 (1)POSIX线程库 (2)pthread_create--创建线程 A:关于Linux线程的再理解 B:线程ID及地址空间布局 (3)pthread_exit--线程终止 (4)pthr ...
- 线程控制、如何给面试官描述线程不安全的情况?模拟黄牛抢票展现不安全的情况及解决方式、互斥锁加锁解锁
多线程1 线程概念 线程控制 线程创建 线程终止 线程等待 线程分离 线程安全 如何给面试官描述线程不安全的现象? 线程不安全的情况(模拟黄牛抢票) 互斥 互斥锁的原理 互斥锁的接口 静态初始化 动态 ...
- Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制
线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...
- Linux多线程---线程概念和线程控制
线程概念 什么是线程? CPU视角: 与进程的关系: Linux下线程概念 那么CPU能分辨task_struct是进程和线程吗? 理解页表 为何以多级页表实现? 多级页表是如何实现的? 多级页表的优 ...
- Java多线程开发系列之四:玩转多线程(线程的控制2)
在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...
- Win32多线程编程(2) — 线程控制
Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...
- [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)
文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...
- 【Linux】线程概念与线程控制
认识线程 线程是一个执行流(运行代码,处理数据) 1.操作系统使用pcb来描述一个程序的运行-------pcb就是进程 2.linux下通过pcb模拟实现线程,因此linux下的线程是一个轻 ...
最新文章
- 20分钟+1080显卡,能跑多复杂的模型?
- 洛谷P2503 [HAOI2006]均分数据(模拟退火)
- es 插入数据_记录一次Java导入百万级数据到Elasticsearch经历
- python基础-类的继承
- 咦,拆分个字符串都这么讲究?
- android studio json插件_热门Android Studio 插件,这里是Top 20
- python 金字塔的程序_python生成金字塔
- 吐槽大会4_《吐槽大会4》不愧都是国家队,真吐槽!孙杨霸气喊话霍顿
- centOS 7镜像文件下载
- db h2 数据类型_H2数据库函数及数据类型概述
- component多个 vue_VUE多个组件示例
- python面对对象编程写一个程序有一个汽车_汽车类面向对象编程Python
- python3使用ddt框架进行外部传参
- SwitchHosts下载安装使用
- 远程监控有效保护家庭安全
- Spyglass之CDC检查(5)
- IPv6路由信息的序号
- 资源变现小程序添加折扣充值和折扣影票插件
- 算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出
- 三星临时取消Galaxy Fold中国发布会;视觉中国网站部分恢复上线?官方回应:并未恢复;特斯拉周一发布完全自动驾驶将网络直播 | 雷锋早报...