线程概念与线程创建

线程概念与线程创建

学习目标:

掌握守护进程创建
了解线程概念与三级映射
掌握线程创建与线程属性分离线程


进程组、会话、控制终端:

进程
shell里的每个进程都属于一个进程组,创建进程组的目的时用于简化向组内所有进程发送信号的操作,即如果一个信号是发给一个进程组,则这个组内所有的进程都会收到该信号[方便管理]。

会话

一个用户登入后新建一个会话,每个会话都有一个ID来表示(SID),登入后第一个进程叫做会话领头进程(shell/bash)。

控制终端

一个会话一般拥有一个控制终端用于执行IO操作,会话领头进程打开一个终端之后,该终端就称为该会话的控制终端,与控制终端建立连接的会话领头进程也被称为控制进程。一个会话只能有一个控制终端。


守护进程:

**守护进程:**是Daemon进程。是Linux中后台服务进程,脱离控制终端,一般不与用户直接交互。周期的执行某种任务或周期性的等待某个事件发生。不受用户登入注销影响,通常以d结尾的命名方式

守护进程创建步骤:

  1. fork子进程,父进程终止 。
  2. 子进程调用setsid()创建新会话。
  3. 通常根据需要,改变工作目录位置chdir(),防止目录被卸载
  4. 通常根据需要,重设umask文件权限掩码,影响新文件的创建权限。
  5. 通常根据需要,关闭/重定向文件描述符
  6. 守护进程,业务逻辑。

线程:

线程与进程区别:

-进程:有独立的进程地址空间。有独立的PCB(分配资源的最小单位)

-线程:有独立的PCB。没有独立的进程地址空间(最小单位的执行)

[ps -Lf 进程id → 线程号 LMP]

线程共享资源:

  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、对信号支持不好

三级映射: Linux内核一般采用三级映射模型,页面→页表→页目录。
在这里插入图片描述


pthread_self函数:

pthread_self函数: 获取线程id。线程id是在进程地址空间内部,用来表示线程身份的id号。

pthread_t pthread_self(void);

返回值
本线程id

检查出错返回

fprintf(stderr,"xxx error: %s\n",strerror(ret));

pthread_create函数:

pthread_create函数: 创建线程。

int pthread_create(pthread_t *tid,const pthread_attr_t *attr,void*(*start_rountn)(void*),void *arg);

参数
tid:传出参数,新建的线程id。
attr:线程属性。
start_rountn:线程回调函数,创建成功时,pthread_create返回时,会自动调用该函数。
arg:线程回调函数的参数。

返回值
成功:0。
失败:errno。


pthread_exit函数:

pthread_exit函数: 退出当前线程

void pthread_exit(void *retval);

参数
retval:退出值,无退出值时NULL。

区别

exit(); //退出当前进程
return;//返回到调用者
pthread_exit();//退出当前线程

pthread_join函数:

pthread_join函数: 阻塞回收线程。

int pthread_join(pthread_t thread,void **retval);

参数
thread:待回收的线程ID。
retval:传出参数,回收该线程的退出值。

返回值
成功:0。
失败:errno。


pthread_detach函数:

pthread_detach函数: 设置线程分离。

int pthread_detach(pthread_t thread);

参数
thread:待分离的线程ID。

返回值
成功:0。
失败:errno。


pthread_cancel函数:

pthread_cancel函数: 杀死一个线程,需要达到取消点。

int pthread_cancel(pthread_t thread);

参数
thread:待杀死的线程ID。

返回值
成功:0。
失败:errno。

如果线程没有到达取消点,那么pthread_cancel无效,需要在程序中添加一个取消点(pthread_testcancel();)。 成功被pthread_cancel函数杀死的线程返回值为-1。

线程属性:

线程属性: 属性值不能直接设置,要使用相关函数进程操作。
非分离状态
线程的默认属性是非分离态,该情况下,原有线程等待创建的线程结束,只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。
分离状态
分离线程没有被其它的线程所等待,自己运行结束了,线程也相应终止,马上释放系统资源。

设置分离属性:

pthread_attr_t attr;//创建一个线程属性结构体变量
pthread_attr_init(&attr);//初始化线程属性
pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);//设置线程属性为分离态
pthread_create(&itd,&attr,tfn,NULL);//结组修改后的线程属性创建为分离态的新线程
pthread_attr_destroy(&attr);//销毁一个线程属性对象

参数
thread:待分离的线程ID。

返回值
成功:0。
失败:errno。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值