引言
在Linux内核中其实并没有线程与进程的概念,只有任务概念。那么进程与线程的关系在:【Linux学习笔记32】进程与线程的基本理解也有记录过。所以这一篇笔记主要介绍线程的创建以及属性设置。
为什么要在进程中创建多条线程?
- 每一条线程都有自己独立的执行状态
- 线程共享进程中的所有资源
创建线程
int pthread_creat(pthread_t *thread,
const pthread_attr_t *attr,
void *(*start_routine)(void *),void *arg);
- main主线程在运行到pthread_creat函数创建子线程
- 子线程独立运行自己的状态
- 主线程与子线程平等,共享资源一样
- 如果主线程先退出,子线程依然不受影响
线程的属性设置
与线程属性有关的API:
由于线程的属性太多,不会在pthread_creat中直接设置属性,所以一般按照这样的步骤使用:
- 定义线程属性变量,并且使用
pthread_attr_init()
初始化 - 使用
pthread_attr_setXXX()
来设置相关的属性 - 使用该线程属性变量创建相应的线程:将指定的线程函数放到
pthread_creat
中的pthread_attr_t *attr
属性中创建线程 - 使用
pthread_attr_destory()
销毁该线程属性变量
下面以线程的分离属性举例
分离属性:
如图两个不同属性的线程
- 不具有分离属性的线程运行结束后,线程不会自动释放资源,而是会进入僵尸态,需要手动释放资源,那么这种线程适合有返回值的线程,其他线程可以通过使用
pthread_join()
函数活动该线程的返回值后,然后让该线程释放资源。 - 具有分离属性的线程,适合不具备返回值的话,则会自动释放资源。
代码实现
1.包含线程头文件:#include<pthread.h>
创建未分离线程的详细代码:
运行结果:
创建分离线程的详细代码:
运行结果:
主线程打印:非法参数
因为线程已经分离了,没有办法再接合这个返回值
第二种设置线程分离的方法:
pthread_detach()
但是这种方法会有两种情况:
- 第一种:就是上图的运行结果,创建线程没有指定分离,创建成功后子线程自己分离,但是主线程比子线程快,因此主线程已经开始使用join函数去接合子线程了,就会输出abc
- 第二种:子线程比主线程快,子线程已经完成了分离,主线程才调用join已经不能接合子线程了