Linux线程及相关概念

举报
王建峰 发表于 2021/11/19 06:49:41 2021/11/19
【摘要】 拥有梦想是一种智力,实现梦想是一种能力。   线程&进程 通常线程指的是共享相同地址空间的多个任务,每个任务是一个线程,而这种多线程的机制构成一个进程。普通进程只有一个线程,那就是main()函数的执行;而多线程进程可以有多个线程,main()是主线程,其他是子线程。 进程 进程有独立的地址空间...

拥有梦想是一种智力,实现梦想是一种能力。

 

线程&进程

通常线程指的是共享相同地址空间的多个任务,每个任务是一个线程,而这种多线程的机制构成一个进程。普通进程只有一个线程,那就是main()函数的执行;而多线程进程可以有多个线程,main()是主线程,其他是子线程。

进程

  • 进程有独立的地址空间
  • Linux为每个进程创建task_struct
  • 每个进程都参与内核调度,互不影响

 

线程

  • 进程在切换时系统开销大
  • 很多操作系统引入了轻量级进程LWP
  • 同一进程中的线程共享相同地址空间
  • Linux不区分进程、线程

 

比如,我们要实现同样一个服务,使用多线程要比多进程好得多。多线程大大提高了任务切换的效率,避免了额外的TLB & cache的刷新。

 

多线程共享资源和私有资源


一个进程中的多个线程共享以下资源

  • 可执行的指令
  • 静态数据
  • 进程中打开的文件描述符
  • 当前工作目录
  • 用户ID
  • 用户组ID

 

每个线程私有的资源包括

  • 线程ID (TID)
  • PC(程序计数器)和相关寄存器
  • 堆栈
  • 错误号 (errno)
  • 优先级
  • 执行状态和属性

 

线程操作

通过pthread线程库,我们可以创建线程、回收线程、结束线程

和进程的使用类似,在主线程中通过pthread_create创建一个子线程,在线程内容执行完通过pthread_exit()结束线程,子线程结束后调用pthread_join来回收线程。

 

线程创建 – pthread_create

 #include  <pthread.h>
 int  pthread_create(pthread_t *thread, const
       pthread_attr_t *attr, void *(*routine)(void *), void *arg);

  •  成功返回0,失败时返回错误码
  •  thread 线程对象
  •  attr 线程属性,NULL代表默认属性
  •  routine 线程执行的函数
  •  arg 传递给routine的参数
     

 

线程结束 – pthread_exit


 #include  <pthread.h>
 void  pthread_exit(void *retval);
       

  •  结束当前线程
  •  retval可被其他线程通过pthread_join获取
  •  线程私有资源被释放
     

 

线程回收 – pthread_join

 #include  <pthread.h>
 int  pthread_join(pthread_t thread, void **retval);
       

  •  成功返回0,失败时返回错误码
  •  thread 要回收的线程对象
  •  调用线程阻塞直到thread结束
  •  *retval 接收线程thread的返回值

 

 

文章来源: blog.csdn.net,作者:hinzer,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/feit2417/article/details/81301780

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。