线程控制

线程基本概念

  1. 程序中的一个执行路线
  2. CPU调度的基本单元,程序执行的最小单位
  3. 具有线程控制块(TCB),Linux下,有进程模拟实现,即TCB也就是task_struct结构体
  4. 所有的线程都共享其进程的地址空间,但是有其独立的上下文资源和栈空间
  5. 关于详细的线程概念,大家可以参考:https://blog.csdn.net/Code_ZX/article/details/85168337

线程控制

  1. 所用库:POSIX线程库,使用编译器命令时需要加“-pthread”选项
    1.头文件:
    注:库都是对系统调用接口的封装

  2. 线程创建
    int pthread_create(pthread_t thread, const pthread_attr_t attr, void (start_routine)(void), void arg);
    thread:线程id(不被操作系统所知)
    attr:设置线程属性,一般设置为默认:NULL
    start_routine:线程启动后要执行的函数的地址
    arg:传递给其执行函数的参数
    成功返回0,失败返回错误码

  3. 线程组
    1.引入:Linux中,线程被称为轻量级进程,即每一个用户态进程对应一个进程描述符(task_struct结构体),为了解决在没有线程时,一个进程描述符对应一个进程id的问题,则引入了线程组
    2.概念:线程组,又称多线程进程,即在该进程中只有一个进程描述符,但是其对应的id并不是进程id,而是主线程id,另外的线程的id链接在主线程id之后
    3.获取线程id(两个)
    (a). 命令(加-L选项):ps -Lf
    获取的是线程的标识符数值
    线程控制_第1张图片
    2.系统调用接口
    syscall(SYS_gettid)
    获取的是线程的操作句柄
    3.库函数
    pthread_t pthread_self(void);
    获取自身线程id,其实质也是线程操作句柄
    注:Linux下,就pthread_t类型的线程id而言,本质就是一个进程地址空间上的一个地址
    线程控制_第2张图片

  4. 线程终止
    1.return +返回值
    注:在主线程(main)中,不适用
    2.通过pthread_exit()将自己终止
    void pthread_exit(void value_ptr);
    value_ptr:传递给线程返回值的参数
    无返回值
    3.调用pthread_cancel()取消一个执行中的线程
    int pthread_cancel(pthread_t thread);
    thread:要终止的线程的线程id
    成功返回0,失败返回错误码

  5. 线程等待
    int pthread_join(pthread_t thread, void value_ptr);
    thread:线程id
    value_ptr:指向线程返回值的指针,设置为NULL,表示对其返回值不感兴趣
    成功返回0,失败返回错误码
    作用:释放线程资源,避免不等待导致产生类似于进程中僵尸进程,以至于造成内存泄漏的问题

  6. 线程返回值
    1.通过return的方式返回:返回值即使return的返回值
    2.通过pthread_exit()返回:返回值就是调用pthread_exit()函数时传入的参数
    3.通过pthread_cancel()返回:返回值就是宏 PTHREAD_CANCELED
    获取返回值代码(包含线程创建,终止,等待的代码):
    https://github.com/zxshuaige/Linux_code/blob/master/pthread_t.c

  7. 线程分离
    int pthread_detach(pthread_t thread);
    作用:告诉操作系统在线程退出后自动释放线程资源,即不需要再进行线程等待
    注:在不关心线程返回值的时候使用线程分离释放线程资源,否则使用线程等待释放线程资源,不能即使用线程等待,又使用线程分离,二者只能取其一
    线程分离测试代码:https://github.com/zxshuaige/Linux_code/blob/master/pthread_d.c

谢谢大家的阅读,希望你们有所收获,最近复习Linux的基本知识,希望能熟练使用Linux…
线程控制_第3张图片

你可能感兴趣的:(学习笔记)