线程概念与线程创建
文章目录
学习目标:
掌握守护进程创建
了解线程概念与三级映射
掌握线程创建与线程属性分离线程
进程组、会话、控制终端:
进程
shell里的每个进程都属于一个进程组,创建进程组的目的时用于简化向组内所有进程发送信号的操作,即如果一个信号是发给一个进程组,则这个组内所有的进程都会收到该信号[方便管理]。
会话
一个用户登入后新建一个会话,每个会话都有一个ID来表示(SID),登入后第一个进程叫做会话领头进程(shell/bash)。
控制终端
一个会话一般拥有一个控制终端用于执行IO操作,会话领头进程打开一个终端之后,该终端就称为该会话的控制终端,与控制终端建立连接的会话领头进程也被称为控制进程。一个会话只能有一个控制终端。
守护进程:
**守护进程:**是Daemon进程。是Linux中后台服务进程,脱离控制终端,一般不与用户直接交互。周期的执行某种任务或周期性的等待某个事件发生。不受用户登入注销影响,通常以d结尾的命名方式
守护进程创建步骤:
- fork子进程,父进程终止 。
- 子进程调用setsid()创建新会话。
- 通常根据需要,改变工作目录位置chdir(),防止目录被卸载
- 通常根据需要,重设umask文件权限掩码,影响新文件的创建权限。
- 通常根据需要,关闭/重定向文件描述符
- 守护进程,业务逻辑。
线程:
线程与进程区别:
-进程:有独立的进程地址空间。有独立的PCB(分配资源的最小单位)
-线程:有独立的PCB。没有独立的进程地址空间(最小单位的执行)
线程共享资源:
- 文件描述符表
- 每种信号处理方式
- 当前工作目录
- 用户ID和组ID
- 内存地址空间(.text/.data/.bss/heap/共享库)
线程非共享资源:
- 线程ID
- 处理器线程和栈指针(内核栈)
- 独立的占空间(用户空间栈)
- errno变量
- 信号屏蔽字
- 调度优先级
线程优、缺点
优点:
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_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。