Linux之多线程概念

1. Linux线程概念

线程是进程内部的一个控制序列。线程就是创建出来的执行流,在内核当中创建了一个PCB,在内核当中创建了一个task_struct这样的结构体;
在这里插入图片描述
fork在内核当中以父进程的PCB为模板拷贝父进程的PCB当中的内容创建了一个PCB,PCB被内核使用并且用双向链表管理起来。vfok在内核当中以父进程的PCB为模板拷贝父进程PCB当中的部分内容创建了一个PCB。子进程的PCB指向父进程的虚拟地址空间,并被双向链表管理起来。这就导师调用栈混乱的问题,让子进程先运行进而让父进程再运行。

2. Linux进程和线程

线程和进程

  • 进程是资源分配的基本单位。
  • 线程是操作系统调度的基本单位。
  • 线程共享数据,单页拥有自己的一部分数据。
  • 线程ID相当于pid,而进程ID相当于tgid,也就是线程组ID。

在共享区中有线程ID,一组寄存器,栈,errno,信号屏蔽字和调度优先级

进程的多个线程共享

多个线程共享同一块地址空间,因此如果定义一个函数,在各个线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问的到,除此之外,线程还共享文件描述符、每个信号的处理方式、当前工作目录、用户ID和组ID。其中进程和线程的关系如下:
在这里插入图片描述

3. Linux线程控制

线程创建——>实际上就是创建一个轻量级进程

函数:int pthread_create(pthread_t* tid, pthread_attr_t* attr, void*(*start_thread)(void*), void*)
tid :线程标识符,线程在共享区中独有的空间的首地址。
attr:线程属性,可以传NULL,表示采用默认属性。
start_thread:线程的入口函数。
void*:线程入口函数的参数。
返回值:成功返回0,失败返回-1。

进程终止

如果需要只终止某个线程而不终止整个进程,可以有三种方法:

  1. 从线程的入口函数return返回。
  2. 线程可以调用pthread_exit函数终止自己,pthread_exit(void* retval);
    retval:当前线程的退出信息,也可以传NULL。
  3. pthread_cancel(pthread_t thread)
    调用pthread_cancel函数的执行流,可以终止thread执行流,也可以传入自己的线程标识符,用来终止自己获取自己的线程表示符:pthread_self().

线程等待

前提知识:采用默认属性创建一个线程的时候,线程当中有一个属性是joinable属性,当线程退出的时候,依赖其他的执行流回收其他的资源,否则在该线程退出的时候,就会导致该线程的资源没有被回收,从而导致内存泄漏。

函数:pthread_join(pthread_t, void**);
调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:

  1. 如果thread线程通过return返回,value_ ptr所指向的单元里存放的是thread线程函数的返回值。
  2. 如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数PTHREAD_ CANCELED。
  3. 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
  4. 如果对thread线程的终止状态不感兴趣,可以传NULL给value_ ptr参数。

功能作用:可以回收对应线程的资源,防止线程退出的时候,导致资源泄漏(内存泄漏)。
在这里插入图片描述

4. 分离线程

默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而导致内存泄漏。当设置线程的属性为detach属性时,程序不用关心线程退出时内存泄漏的情况,原因是detach属性可以使退出的线程不需要其他线程回收自己的资源,在线程退出时可以被操作系统自动回收。
函数:pthread_detach(pthread_t thread);
参数:thread:该线程标识符指的是分离哪一个线程==(设置哪一个线程的joinable属性为detach属性)==

5.线程安全

进程线程间的互斥相关背景概念

  • 临界资源:多线程执行流共享的资源就是临界资源。
  • 临界区:每个线程内部,访问临界资源的代码,就叫做临界区。
  • 互斥:任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起保护作用。
  • 原子性:不会被任何调度机制打断的操作,该操作只有两态,要么完成,要么未完成。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值