python3 网站建设,数据分析师就业前景,职业技能培训班,伯爵手表网站注意#xff1a; 以下所有的接口都是使用的Linux下的原生线程库#xff0c;所有g/gcc编译的时候需要加上参数-lpthread#xff0c;编译pthread动态库。
1、线程的创建pthread_create
相关接口#xff0c;创建线程函数#xff0c;成功返回0#xff0c;失败返回一个错误码…注意 以下所有的接口都是使用的Linux下的原生线程库所有g/gcc编译的时候需要加上参数-lpthread编译pthread动态库。
1、线程的创建pthread_create
相关接口创建线程函数成功返回0失败返回一个错误码。
#includepthread.h
int pthread_create(pthread_t* thread,const pthread_attr_t *attr,
void*(*start routine)(void*),void* arg);pthread_t* thread内核数据类型输入型参数获取线程ID。const pthread_attr_t *attr用于定制各种不同的线程属性一般置空NULL这里不提倡自定义设置因为没有比操作系统最了解线程的属性。void*(start routine)(void)函数指针线程创建出来所要执行的函数新创建的线程从start_rtn函数的地址开始运行该函数只有一个void*类型的参数argvoid* arg:想给所创建的线程传入的参数即线程执行函数中的参数。如果需要向start_rtn函数传递的参数不止一个那么需要把这些参数放到一个结构体中然后把这个结构的地址作为arg参数传入
2.获取线程id,pthread_self
不应使用全局变量 pthread_t tid在子线程中通过pthread_create传出参数来获取线程ID而应使用pthread_self。线程ID是进程内部识别标志。(两个进程间线程ID允许相同)
#includepthread.h
pthread_t pthread_self(void)
//在哪个线程内部调用即返回哪个线程的线程ID3.线程等待pthread_join
一般而言线程也是需要被等待的如果不等待可能会导致类似于”僵尸进程“的问题看一下相关接口,如下 成功返回0失败返回一个错误码。
#includepthread.h
int pthread_join(pthread_t thread,void **retval);pthread_t thread线程ID要等待哪个线程void **retval输出型参数用来获取新线程退出的时候函数的返回值即获取线程的退出状态。
代码异常的情况需不需要线程处理 我们都知道代码的运行存在三种情况1.代码运行完结果对。2.代码运行完结果不对。3.代码异常。对于1和2的情况都会有相应的返回值接收但是对于第3种情况线程不需要处理这是进程需要关心的。 此外如果线程在运行的过程中出现问题异常崩溃会导致整个进程崩溃掉
4.线程终止pthread_exit
#includepthread.h
void pthread_exit(void *retval)retval表示线程退出状态通常传NULL。
注意 线程中禁止使用exit函数会导致进程内所有线程全部退出。 在不添加sleep控制输出顺序的情况下。pthread_create在循环中几乎瞬间创建5个线程但只有第1个线程有机会输出或者第2个也有也可能没有取决于内核调度如果第3个线程执行了exit将整个进程退出了所以全部线程退出了。 所以多线程环境中应尽量少用或者不使用exit函数取而代之使用pthread_exit函数将单个线程退出。任何线程里exit导致进程退出其他线程未工作结束主控线程退出时不能return或exit。 另注意pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的不能在线程函数的栈上分配因为当其它线程得到这个返回指针时线程函数已经退出了。
线程调用return、pthread_exit、exit总结 return返回到调用者那里去。 pthread_exit()将调用该函数的线程 exit: 将进程退出。 此处借鉴于[https://blog.csdn.net/qq_44177918/article/details/130442584]
5.取消目标线程pthread_cancel
取消目标线程也是线程终止的一种下面让我们来看一下取消目标线程的接口。
#includepthread.h
int pthread_cancel(pthread_t thread)6.线程分离pthread_detach
上面讲了线程是需要等待的否则会出现像僵尸进程一样的问题那么如果不想等待呢线程库提供了一种接口采用线程分离的方法分离之后的线程不需要被join运行完毕之后会自动释放Z状态下的PCB控制块。线程分离的接口如下
#includepthread.h
int pthread_detach(pthread_t thread);注意一个线程被设置为分离之后绝对不能进行join了主线程不退出新线程处理业务处理完毕在退出