Linux多线程学习笔记(2)-Linux线程的创造和生命

本文介绍了Linux环境下线程的创建、生命周期及其四种基本状态。主要内容包括:线程ID的获取,使用pthread_create创建线程,主线程的特殊性,线程的就绪、运行、阻塞和终止状态。此外,还讨论了线程的分离属性,即终止线程时资源的回收。
摘要由CSDN通过智能技术生成

Linux多线程学习笔记(2)-Linux线程的创造和生命

1 创建新的线程

1.1 线程ID

线程进程
标识符类型pthread_tpid_t
获取idpthread_self()getpid()
创建pthread_create()fork()

示例:

#include <pthread.h>
int main(){
	pid_t pid;
	pthread_t tid;
	pid = getpid();
	tid = pthread_self();
	printf(“pid is %u, tid is %u\n”,pid,tid);
}

1.2 创建线程

int pthread_create(pthread_t *restrict tidp, 
					const pthread_attr_t *restrict attr, 
					void *(*start_routine)(void *), 
					void *restrict arg)

第一个参效:新线程的id,如果成功则新线程的d回填充到dp指向的内存
第二个参数:线程属性(调度策略,继承性,分离性等)
第三个参数:回调函数(新线程要执行的函数)
第四个参数:回调函数的参数
返回值:成功返回0,失败则返回错误码
编译时需要连接库 libpthread,如果是在qt里使用,需要在pro文件中添加 LIBS += -lpthread。

2 线程的生命周期

2.1 初始线程/主线程

① 当c程序运行时,首先运行main函数。在线程代码中,这个特殊的执行流被称作初始线程或者主线程。你可以在初始程中做任何普通线程可以做的事情。
② 主线程的持殊性在于,它在main函数返回的时候,会导致进程结束,进程内所有的线程也将会结束。这可不是个好的现象,你可以在主线程中调用 pthread_exite函数,这样进程就会等待所有线程结束时才终止
③ 主程接受参数的方式是通过argc和argv,而普通的线程只有一个参数void
④ 在绝大多数情况下,主线程在默认堆栈上运行,这个堆栈可以增长到足够的长度。而普通程的堆栈是受限制的,一旦溢出就会产生错误。

2.2 线程的创建

① 主线程是随着进程的创建而创建
② 其他线程可以通过调用函数来创建,主要调用pthread_ create
请注意,新线程可能在当前线程从函数pthread_ create返回之前就已经运行了,基至新线程可能在当前线程从函数pthread_create返回之前就已经运行完毕了。

3 线程的四个基本状态

状态含义
就绪线程能够运行,但是在等待可用的处理器
运行线程正在运行,在多核系统中,可能同时有多个线程在运行
阻塞线程在等待处理器以外的其他条件
终止线程从启动函数中返回,或者调用pthread_exit函数,或者被取消

在这里插入图片描述

3.1 就绪

当线程刚创建时就处于就绪状态,或者当线程被解除阻塞以后也会处于就绪状态。就绪的线程在等待一个可用的处理器,当一个运行的线程被抢占时,它立刻又回到就绪状态。

3.2 运行

当处理器选中一个就绪的线程执行时,它立刻变成运行状态。

3.3 阻塞

线程会在以下情兄下发生阻塞:试图加锁一个已经锁住的互斥里,等待某个条件变量,调用 singwait等待尚未发生的信号,执行无法完成的I/O信号,由于内存页错误。

3.4 终止

线程通常启动函数中返回来终止自己,或者调用pthread_exit退出,或者取消线程。

4 线程回收

线程的分离属性:
① 分离一个正在运行的线程并不影响它,仅仅是通知当前系该线程结束时,其所属的资源可以回收。一个没有被分离的线程在终止时会保留它的虚拟内存,包括他们的堆栈和其他系统资源,有时这种线程称为“僵尸线程”。创建线程时默认是非分离的
② 如果线程具有分离性,线程终止时会被立刻回收,回收将释放掉所有在线程终止时未释放的系统资源和进程资源,包括保存线程返回值的内存空间、堆栈、保存寄存器的内存空间等。
③ 终止被分离的线程会释放所有的系统资源,但是你必须放由该线程占有的程序资源。由 malloc或者mmap分配的内存可以在任何时候由任何线程释放,条件变量、互斥量、信号灯可以由任何线程销毁,只要他们被解锁了或者没有线程等待。但是只有互斥量的主人才能解锁它,所以在线程终止前,你要解锁互斥量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值