多线程--线程控制

Posted 李憨憨_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程--线程控制相关的知识,希望对你有一定的参考价值。

线程控制: 创建,退出,等待,分离;
Linux并没有向上提供用于创建线程的接口。因此大佬们对系统调用接口进行封装实现了上层用户态的线程控制接口

在这里插入图片描述

1.线程创建

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

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>
  4 #include<pthread.h>
  5 void *thr_entry(void *arg)
  6 {
  7     printf("%s\\n", (char*)arg);
  8     while(1){
  9         printf("i am normal thread\\n");
 10         sleep(1);
 11     }
 12     return NULL;
 13 }
 14 int main()
 15 {
 16     pthread_t tid;
 17     int ret;
 18     char *ptr = "今天的天气好晴朗\\n";
 19     //pthread_creat(获取ID, 属性, 入口函数, 传入参数)
 20     ret = pthread_create(&tid, NULL, thr_entry, (void*)ptr);
 21     if(ret != 0){
 22         printf("pthread_creat failed!\\n");
 23         return -1;
 24     }
 25     while(1){
 26         printf("i am main thread\\n");
 27         sleep(1);
 28     }
 29     return 0;
 30 }

两个线程都在运行
在这里插入图片描述


在每个线程的pcb中都有一个pid和tgid
pid是轻量级进程id–LWP;tgid是线程组id-默认等于主线程的pid
tid:这是一个地址–线程独有空间的地址
每个线程被创建,都会在进程的虚拟地址空间中开辟出一块相对独立的空间
在每个线程的pcb中都有一个pid和tgid
pid是轻量级进程id–LWP;tgid是线程组id-默认等于主线程的pid
tid:这是一个地址–线程独有空间的地址
在这里插入图片描述

2.线程退出

退出:如何退出线程
   线程入口函数中return(线程入口函数运行完毕,则线程会退出)
进程退出, 所有线程都会退出
void pthread_exit(void *retval);

取消指定的线程(被动退出)
在任意位置调用都可以退出线程

在这里插入图片描述

int pthread_cancel(pthread_t thread);
取消指定的线程(被动退出)

在这里插入图片描述

主线程退出,并不会导致进程退出,所有线程退出,才会退出进程; 进程退出,会退出所有的线程;

3.线程等待

等待:等待一个指定的线程退出,获取退出线程的返回值,回收线程资源。线程退出后,默认也不会自动释放资源,需要被等待
int pthread_join(pthread_t thread, void **retval);

是一个阻塞接口
在这里插入图片描述


tid:指定要等待的线程id; retval:用于获取退出线程的返回值
返回值:成功返回0; 失败返回非0-错误编号;

4.线程分离

线程有个属性-分离属性,这个属性默认是joinable状态,处于joiinable的线程退出之后不会自动释放资源,需要被其他线程等待
分离:将线程的分离属性,设置为detach状态
 处于detach状态的线程退出后,会自动释放资源,不需要被等待
应用场景:不关心线程的退出返回值,也不想等待一个线程的退出
int pthread_detach(pthread_t thread);

在这里插入图片描述

以上是关于多线程--线程控制的主要内容,如果未能解决你的问题,请参考以下文章

多线程 Thread 线程同步 synchronized

多个请求是多线程吗

线程学习知识点总结

MySQL系列:kafka停止命令

八.多进程与多线程

多线程是啥