线程概念以及Linux下提供的线程控制接口

线程概念

在早些时候, 我们学习进程的时候, 说进程就是一个pcb, 是操作系统对运行中程序的描述, 通过这个描述实现对运行中程序的调度执行, 然而现在学习线程, 线程其实是进程当中的一条执行流, 在linux下是通过pcb实现的, 因此我们说linux下的pcb实际上是一个线程, 并且这些pcb共用同一块地址空间, 这些pcb更加轻量化, 因此也被称作轻量级进程.

实际上, 这个时候我们并不以pcb去区分线程和进程, 通常我们这样去理解:
进程是操作系统资源分配的基本单位
线程是cpu调度执行的基本单位

线程控制

线程创建 / 线程终止 / 线程等待 / 线程分离

我们要知道, 操作系统其实并没有提供给我们进行线程控制的接口, 我们用来实现线程控制的接口是大佬们封装的库函数, 我们在上层创建线程, 其实在内核态伴随创建一个pcb完成程序的调度执行.

线程创建

int pthread_create(pthread_t* tid, pthread_attr_t* attr, void* (*thread_routine)(void*), void* arg);
//tid : 用于获取所创建线程的id---也就是线程的操作句柄
//attr : 线程属性, 用于在创建线程的时候设置线程属性, 通常置NULL
//thread_routine : 线程入口函数, 就是说我们创建出来的线程就是用来运行这个函数的, 这个函数运行完毕, 线程也就会退出
//arg : 通过线程入口函数传递给线程的参数
//返回值: 成功返回0 ,失败返回非0-表示错误编号

线程创建出来共用同一块虚拟地址空间, 但是为了防止调用栈混乱, 每个线程在进程的虚拟地址空间中都有一个自己相对独立的线程地址空间(这其实就是tid)
tid : 线程地址空间的首地址, 是一个线程id, 线程的操纵句柄

线程终止

  1. 当线程入口函数执行完毕后, 会自动退出;

  2. 在main函数中调用return, 但是我们要注意, 这样去做退出的是进程而不是主线程.

  3. 调用接口退出线程

     void pthread_exit(void* retval);//该接口谁调用谁退出
     //retval是退出返回值
     //主线程调用也会退出, 但是进程不会退出, 只有当所有线程都退出了, 进程才会退
     --------------------------------------------------------------
     int pthread_cancel(pthread_t tid);//终止一个指定线程, 退出的线程是被动取消的
     //成功返回0, 否则非0
    
  4. 线程等待

在学习线程等待之前, 我们要知道, 创建出来的线程默认是joinable属性, 处于这个属性的线程, 退出后需要被其它线程等待获取返回值回收线程资源.

pthread_join(pthread_t tid, void** retval);//等待指定线程退出, 获取其返回值
//注意我们之前使用pthread_exit退出线程时, 线程的返回值为void* retval, 是一个一级指针
//而这里retval同样是一个输出型参数, 因此要使用二级指针

除此之外, 我们还可以使用线程分离, 可以将线程属性由joinable变为detach.
一个线程若是joinable属性, 那么它必须被其它线程等待, 获取返回值, 释放资源;
一个线程若是detach属性, 那么它不需要被等待, 该线程退出后会自动释放资源;

int pthread_detach(pthread_t tid);//将指定线程分离, 属性修改为detach
  1. 获取线程id

     pthread_t pthread_self(void);//返回调用线程的tid
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值