我是靠谱客的博主 孝顺大侠,最近开发中收集的这篇文章主要介绍线程基本概念与相关函数线程基本概念与相关函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

线程基本概念与相关函数

1.基本概念

  • LWP:light weight process 轻量级的进程,其本质仍是进程

  • 进程:独立地址空间,拥有PCB

  • 线程:有独立的PCB,但是没有独立的进程地址空间

  • 区别:在于是否共享地址空间

  • linux下:线程:最小的执行单位

    ​ 进程:最小分配资源单位,可以看成只有一个线程的进程

2.线程性质

  • 线程共享资源:

    1. 文件描述符表
    2. 每种信号的处理方式
    3. 当前的工作目录
    4. 用户ID和组ID
    5. 内存地址空间(.text/.data/.bss/heap/共享库)
  • 线程非共享资源

    1. 线程ID
    2. 处理器现场和栈指针(内核栈)
    3. 独立的栈空间(用户空间栈)
    4. errno变量
    5. 信号屏蔽字
    6. 调度优先级
  • 线程优缺点:

    优点:

    1. 提高程序的并发性

    2. 开销小

    3. 数据通信、共享数据方便

    缺点:

    1. 库函数、不稳定
    2. 调试、编写困难、gdb不支持
    3. 对信号的支持不好

3.线程控制

  • pthread_self函数

    • 原型

      pthread_t pthread_self(void);
      
    • 功能:获取线程id

    • 返回值

      成功:返回获取到的线程id

      失败:不会失败

  • pthread_create函数

    • 原型:

      int pthread_create(pthread_t* thread, const pthread_attr_t*
      attr, void*(*start_routine)(void*), void* arg);
      
    • 功能:创建一个新的线程

    • 参数:

      thread:传出参数,新创建线程的线程id

      attr:线程的属性,NULL为默认属性

      start_routine:回调函数,线程创建成功后会自动调用

      arg:回调函数中的参数,可以为NULL(多用于值传递的方式)

    • 返回值

      成功:0

      失败:errno

  • pthread_exit函数

    • 原型:

      void pthread_exit(void* retval);
      
    • 功能:回收线程(exit是退出当前进程,而return是返回调度者),类似于wait的

    • 参数:

      retval:传出参数,返回的可选参数,通常为NULL无退出值

  • pthread_join函数

    • 原型:

      int pthread_join(pthread_t thread, void** retval);
      
    • 功能:阻塞等待线程退出,获取线程的退出状态

    • 参数:

      thread:线程id

      retval:存储线程的结束状态,可以拿到释放进程的返回值,异常结束值为-1

    • 返回值:

      成功:0

      失败:errno

  • pthread_cancel函数

    • 原型:

      int pthread_cancel(pthread_t thread);
      
    • 功能:杀死线程,但是需要到达一个取消点(返回点),可以用pthread_testcancel()函数添加取消点以进入内核

    • 参数:

      thread:待回收线程id

    • 返回值:

      成功:0

      失败:errno

  • pthread_detach函数

    • 原型:

      int pthread_detach(pthread_t thread);
      
    • 功能:线程分离,线程终止后会自动清理PCB,无需回收,detach和join功能相仿

    • 参数:

      thread:待分离线程id

    • 返回值:

      成功:0

      失败:errno

  • 线程属性设置

    pthread_attr_t attr;
    //创建线程属性结构体变量
    pthread_attr_init(&attr);
    //初始化线程属性结构体
    //设置属性为分离态
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    pthread_create(&tid, &attr, tfn, NULL);
    //据修改后的线程属性创建新线程
    phtread_destory_init(&attr);
    //销毁线程属性
    
  • 总结:

    1. 创建线程时pthread_create可以将数据传递给创建的线程

    2. 回收线程时pthread_join可以把线程销毁后的返回值取出

    3. 线程中检查出错的函数要改为

      ret = pthread_detach(thread);
      fprintf(stderr, "xxx error:%sn", strerror(ret));
      
    4. 主线程退出其他线程不退出应该使用pthread_exit

    5. 线程在退出后需要用join的函数释放资源

    6. malloc和mmap申请的内存可以被其他线程使用和释放

    7. 避免多线程和多进程混合使用

    8. 避免信号和多线程混合使用

4.线程与进程的对比

功能线程控制原语进程控制原语
创建pthread_create()fork()
查看IDpthread_self()geipid()
退出pthread_exit()exit()
回收pthread_join()waitpid()
杀死(终止)pthread_cancel()kill()
分离(线程独有)pthread_detach()

最后

以上就是孝顺大侠为你收集整理的线程基本概念与相关函数线程基本概念与相关函数的全部内容,希望文章能够帮你解决线程基本概念与相关函数线程基本概念与相关函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部