文章目录

  • 多线程
    • 线程概念
      • 多任务处理:
    • 多线程/多进程进行多任务处理的优缺点分析
      • 多线程的优点
      • 多进程的优点
      • 共同的优点
    • 线程控制
      • 线程的创建
      • 线程的终止
      • 线程的等待
      • 线程的分离

多线程

线程概念

进行多任务处理

多任务处理:

多创建几个进程,一个进程就有一个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

多线程概念,线程控制相关推荐

  1. Java笔记-多线程之线程控制

    线程控制 我们已经知道了线程的调度,接下来我们就可以使用如下方法对象线程进行控制. 1.线程休眠 public static void sleep(long millis):让当前线程处于暂停状态,m ...

  2. Linux系统编程36:多线程之线程控制之pthread线程库(线程创建,终止,等待和分离)

    文章目录 (1)POSIX线程库 (2)pthread_create--创建线程 A:关于Linux线程的再理解 B:线程ID及地址空间布局 (3)pthread_exit--线程终止 (4)pthr ...

  3. 线程控制、如何给面试官描述线程不安全的情况?模拟黄牛抢票展现不安全的情况及解决方式、互斥锁加锁解锁

    多线程1 线程概念 线程控制 线程创建 线程终止 线程等待 线程分离 线程安全 如何给面试官描述线程不安全的现象? 线程不安全的情况(模拟黄牛抢票) 互斥 互斥锁的原理 互斥锁的接口 静态初始化 动态 ...

  4. Linux 多线程(一)线程概念:线程概念、线程与进程、线程间的独有与共享、多线程与多进程、线程控制

    线程概念 线程与进程 线程间的独有与共享 多线程与多进程 线程控制 线程概念 什么是线程 线程是进程中的一条执行流,执行程序中的某部分代码.linux下没有具体实现的线程,只有库函数用pcb来实现的线 ...

  5. Linux多线程---线程概念和线程控制

    线程概念 什么是线程? CPU视角: 与进程的关系: Linux下线程概念 那么CPU能分辨task_struct是进程和线程吗? 理解页表 为何以多级页表实现? 多级页表是如何实现的? 多级页表的优 ...

  6. Java多线程开发系列之四:玩转多线程(线程的控制2)

    在上节的线程控制(详情点击这里)中,我们讲解了线程的等待join().守护线程.本节我们将会把剩下的线程控制内容一并讲完,主要内容有线程的睡眠.让步.优先级.挂起和恢复.停止等. 废话不多说,我们直接 ...

  7. Win32多线程编程(2) — 线程控制

    Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...

  8. [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)

    文章目录 线程概念 进程和线程的关系 线程的优点 线程的缺点 线程控制 Linux线程和接口关系的认识 线程创建 线程ID及进程地址空间布局 线程等待 线程终止 线程终止状态 线程分离 LWP和pth ...

  9. 【Linux】线程概念与线程控制

    认识线程 线程是一个执行流(运行代码,处理数据) ​ 1.操作系统使用pcb来描述一个程序的运行-------pcb就是进程 ​ 2.linux下通过pcb模拟实现线程,因此linux下的线程是一个轻 ...

最新文章

  1. 20分钟+1080显卡,能跑多复杂的模型?
  2. 洛谷P2503 [HAOI2006]均分数据(模拟退火)
  3. es 插入数据_记录一次Java导入百万级数据到Elasticsearch经历
  4. python基础-类的继承
  5. 咦,拆分个字符串都这么讲究?
  6. android studio json插件_热门Android Studio 插件,这里是Top 20
  7. python 金字塔的程序_python生成金字塔
  8. 吐槽大会4_《吐槽大会4》不愧都是国家队,真吐槽!孙杨霸气喊话霍顿
  9. centOS 7镜像文件下载
  10. db h2 数据类型_H2数据库函数及数据类型概述
  11. component多个 vue_VUE多个组件示例
  12. python面对对象编程写一个程序有一个汽车_汽车类面向对象编程Python
  13. python3使用ddt框架进行外部传参
  14. SwitchHosts下载安装使用
  15. 远程监控有效保护家庭安全
  16. Spyglass之CDC检查(5)
  17. IPv6路由信息的序号
  18. 资源变现小程序添加折扣充值和折扣影票插件
  19. 算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出
  20. 三星临时取消Galaxy Fold中国发布会;视觉中国网站部分恢复上线?官方回应:并未恢复;特斯拉周一发布完全自动驾驶将网络直播 | 雷锋早报...

热门文章

  1. 计算机学术英语演讲,学术英语演讲稿.docx
  2. 上海北大青鸟教学:学习jsp的步骤
  3. python 将多个模型的ROC曲线绘制在一张图里(含图例)
  4. 雄顺房源管理器 绿色
  5. 开发小技巧【开发者工具】
  6. java optional详解_Java 8 中的 Optional 使用详解
  7. Allegro利用Skill实现BGA封装的自动扇出功能
  8. 【微课制作软件】Focusky教程 | 怎样改变图片形状?
  9. aws dynamodb 使用awsapi和PartiQL掌握dynamodb的CRUD操作
  10. 有一段时间没有码字了