云计算百科
云计算领域专业知识百科平台

Linux系统:线程

一. 线程的定义

1.线程是轻量级的进程,线程属于某个进程。
2.作用: 并发和进程相同,可以处理相对比较耗时的任务。

特征:

1.进程是系统中最小的资源分配单位.
2.线程是系统中最小的执行单位。
3.​进程中,线程与线程是平级关系
4.在进程中,默认有一个线程,那个是主线程

与进程的区别:

1.线程可以资源共享,进程资源对立。 线程有各自的栈区,这个区域独立。
2.进程相对稳定,线程不稳定(如果进程中多线程,其中一个崩溃,整个进程崩溃);
3.创建的开销,线程创建需要在进程空间中,开辟一个新的栈区(8MB) .新建一个进程的话,需要创建3GB空间。
4.并发度,线程的并发高于进程的并发度。

在linux里面查看线程信息的命令

1.ps – eLo pid,ppid,lwp,stat,comm
作用:
列出全部进程,并且展开线程,只显示你指定的这几列:进程号、父进程号、内核线程 ID、状态、程序名

2.ps – eLf
作用:
列出全部进程,并且展开线程,使用系统预设的完整字段输出(USER、PID、PPID、LWP、NLWP、STIME、TIME、CMD)自带 NLWP(一个进程总共有多少线程)

线程相关函数

1.线程创建
int pthread_create(pthread_t *thread, const pthread_attr_t
*attr,void *(*start_routine) (void *), void *arg);

功能:该函数可以创建指定的一个线程。
参数:thread 线程id,需要实现定义并由该函数返回。
attr :线程属性,一般是NULL,表示默认属性。
start_routine: 指向指针函数的函数指针,本质上是一个函数的名称即可。称为th回调函数,是线程的执行空间。
arg 回调函数的参数,即参数3的指针函数参数

代码示例:

在这里插入图片描述
注意:

1.在传参的时候,如果不需要传递值,则用NULL

2.创建好子线程之后,如果不对主线程进行阻塞,会导致子线程还未结束就程序终止了一旦 main返回,整个进程直接销毁,终端上看不到输出结果
可以使用while(1)或者阻塞函数 pthread_join

在这里插入图片描述
3.编译的时候要加上-pthread,否则编译失败

在这里插入图片描述

2.获取线程id
pthread_t pthread_self(void)

功能:获取当前线程的线程id
参数:无
返回值:成功 返回当前线程的线程id
失败 : 非0值;

在这里插入图片描述

直接调用即可,不需要传递参数,要注意返回的是一个无符号长整形的数值所有打印要用%lu

在这里插入图片描述
3.线程退出函数
void pthread_exit(void *retval); exit return p;
**功能:**子线程自行退出
参数: retval 线程退出时候的返回状态
返回值:无

在这里插入图片描述

该效果等价与retur NULL,且可以传递一个地址

4.结束某一个线程

int pthread_cancel(pthread_t thread);
功能:请求结束一个线程
参数:thread 请求结束一个线程tid
返回值:成功 0
失败 : 非0值

在哪里调用就发送取消请求

代码示例:
在这里插入图片描述

5.线程空间的回收(阻塞方式)
int pthread_join(pthread_t thread, void **retval);

功能:通过该函数可以将指定的线程资源回收,该函数具有阻塞等待功能,如果指定的线程没有结束,则回收线程会阻塞。
参数:thread 要回收的子线程tid
retval 要回收的子线程返回值/状态。==》ptread_exit(值);
返回值:成功 0
失败: 非0值;

在这里插入图片描述

pthead_exit子线程会返回一个地址,主线程用pthread_join接收返回值,注意使用万能指针,需要什么数据类型需要强转成对应的类型

终端输出结果为子线程返回的值

6.线程自动回收
int pthread_deatch(pthread_t thread)

功能,设置分离属性
参数,线程id号,填自己的id
返回值:成功 0
失败 非0值;

分离之后:这条线程结束的时候,自动回收它的线程资源PCB等调用之后就不需要等待pthread_join回收了,注意一条线程只能调用一次,不可反复调用,否则出错

在这里插入图片描述
使用pthread_detach(),每创建一条线程就标记它为分离态;这条线程执行结束后系统自动回收它的资源。
如果不调用 pthread_detach,也不调用 pthread_join,线程结束后资源不会释放,持续堆积;堆积到大约 32768 个之后,就无法再创建新线程。

在这里插入图片描述

赞(0)
未经允许不得转载:网硕互联帮助中心 » Linux系统:线程
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!