C/C++ 线程超详细讲解(系统性学习day10) 桃扇骨 2024-02-23 01:22 26阅读 0赞 ## ## **目录** 前言 一、线程基础 1.概念 2.一个进程中多个线程特征 2.1 线程共有资源 2.2 线程私有资源 3.线程相关的api函数 3.1 创建线程 创建线程实例代码如下: 需要特别注意的是: \-lpthread和-pthread的区别 3.2 给线程函数传参 传参实例代码如下: 3.3 给线程收尸 收尸实例代码如下: 二、线程状态转换函数说明 1.初始化条件休眠 2.条件休眠,挂起线程 3.唤醒线程 4.设置取消状态 5.设置取消方式 6.取消线程 三 、线程状态转换图片(如图清晰可见) 总结 -------------------- ## 前言 ## 线程指的是在一个进程中独立执行的最小单位。简单来说,线程是进程中的一个执行流,可以理解为执行程序的一条执行路径。本篇文章将对线程进行超详细讲解。 -------------------- ## 一、线程基础 ## ### 1.概念 ### > (1)线程:在进程空间中执行,也是一个动态的过程。 > > (2)一个进程对应一个程序,一个线程对应程序中的一个函数 > > (3)线程是该函数的一次在执行过程,该函数称为线程函数。 ### 2.一个进程中多个线程特征 ### #### 2.1 线程共有资源 #### > (1)可执行的指令(.text) > (2)静态数据(.data/.bss/.heap) > (3)进程中打开的文件描述符 > (4)信号处理函数 > (5)当前工作目录 > (6)用户ID > (7)用户组ID #### 2.2 线程私有资源 #### > (1)线程ID (TID) > (2)PC(程序计数器)和相关寄存器 > (3)堆栈 > (4)局部变量 > (5)返回地址 > (6)错误号 (errno) > (7)信号掩码和优先级 > (8)执行状态和属性 ### 3.线程相关的api函数 ### #### 3.1 创建线程 #### > 头文件: > > \#include <pthread.h> > Compile and link with -pthread. > > int pthread\_create(pthread\_t \*thread, const pthread\_attr\_t \*attr, > void \*(\*start\_routine) (void \*), void \*arg); > //参数1 ----- 保存线程id的变量的地址 > //参数2 ----- 线程属性,一般为NULL,表示使用默认属性 > //参数3 ----- 线程函数指针,必须是下面的格式: > void \* xxx\_fun (void \* arg) > \{ > 线程执行代码 > \} > //参数4 ----- 传给线程函数的参数 > //返回值 ---- 成功:0 ,失败:错误码 ##### 创建线程实例代码如下: ##### #include <stdio.h> #include <unistd.h> #include <pthread.h> void* fun(void* arg) { int i; for(i = 0; i < 7; i++){ printf("我是fun\n"); sleep(1); } return 0; } int main(void) { int i; pthread_t tid; //fun(); if(pthread_create(&tid,NULL,fun,NULL)){ perror("pthread_create"); exit(1); } for(i = 0; i < 7; i++){ printf("我是主函数\n"); sleep(1); } return 0; } ##### 需要特别注意的是: ##### > 编译时,需要链接线程库 > gcc pthread\_create.c -o pthread\_create -lpthread ##### \-lpthread和-pthread的区别 ##### > 两个选项都是用于链接 pthread 库的选项,但它们有一些细微的差别。 > > \-lpthread 是告诉链接器去链接 pthread 库,这是一个标准的链接选项,可以用于链接任何库。 > > \-pthread 是告诉编译器在编译时需要使用 pthread 库,这是一个非标准的编译选项,只能在支持它的编译器上使用。 > > 在大多数情况下,使用 -lpthread 是更好的选择,因为它是标准的链接选项,可以在不同的编译器和操作系统上使用。而 \-pthread 只能在支持它的编译器上使用。 #### 3.2 给线程函数传参 #### ##### 传参实例代码如下: ##### #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> typedef struct{ int sno; char name[20]; float score; }St; void* fun(void* arg) { St *p = (St*)arg; //printf("%d\n",*(int*)arg); //printf("%s\n",(char*)arg); printf("%d %s %.2f\n",p->sno,p->name,p->score); return 0; } int main(void) { pthread_t tid; //int a = 120; //char str[] = "hello world"; St s = {1001,"peter",98.56}; if(pthread_create(&tid,NULL,fun,&s)){ perror("pthread_create"); exit(1); } sleep(1); return 0; } #### 3.3 给线程收尸 #### > int pthread\_join(pthread\_t thread, void \*\*retval); > //参数1 ---- 线程的id > //参数2 ---- 保存线程返回值的指针变量的地址 > //返回值 ---- 成功:0,失败:错误码 ##### 收尸实例代码如下: ##### #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> typedef struct{ int sno; char name[20]; float score; }St; void* fun(void* arg) { static int a = 112200; St *p = (St*)arg; //printf("%d\n",*(int*)arg); //printf("%s\n",(char*)arg); printf("%d %s %.2f\n",p->sno,p->name,p->score); return &a; } int main(void) { pthread_t tid; int *p; //int a = 120; //char str[] = "hello world"; St s = {1001,"peter",98.56}; //创建子线程 if(pthread_create(&tid,NULL,fun,&s)){ perror("pthread_create"); exit(1); } //给指定线程收尸,如果子线程没有结束,则主线程阻塞 //if(pthread_join(tid,NULL)){ if(pthread_join(tid,(void**)&p)){ perror("pthread_join"); exit(1); } printf("*p = %d\n",*p); return 0; } ## **二、线程状态转换函数说明** ## ### 1.初始化条件休眠 ### > 头文件:\#include <pthread.h> > > int pthread\_cond\_init (pthread\_cond\_t \* \_\_cond,const pthread\_condattr\_t \* \_\_cond\_attr) > \* 功能:初始化条件休眠 > \* 参数: > pthread\_cond\_t \* \_\_cond - 指向被初始化的条件变量 > const pthread\_condattr\_t \* \_\_cond\_attr- 指向条件变量的属性,使用默认值NULL > \* 返回值: > 失败:负数,绝对值是错误码 ### 2.条件休眠,挂起线程 ### > 头文件:\#include <pthread.h> > > int pthread\_cond\_wait (pthread\_cond\_t \* \_\_cond, pthread\_mutex\_t \*\_\_mutex); > \* 功能:条件休眠,挂起线程(调用该函数的线程被阻塞了,函数不返回,且休眠状态) > \* 参数: > pthread\_cond\_t \* \_\_cond - 指向条件变量 > pthread\_mutex\_t \*\_\_mutex- 指向互斥锁 > \* 返回值: > 失败:负数,绝对值是错误码 ### 3.唤醒线程 ### > 头文件:\#include <pthread.h> > > int pthread\_cond\_signal (pthread\_cond\_t \*\_\_cond); > \* 功能:唤醒线程(调用该函数的唤醒被pthread\_cond\_wait阻塞的线程) > \* 参数: > pthread\_cond\_t \* \_\_cond - 指向条件变量 > \* 返回值: > 失败:负数,绝对值是错误码 ### 4.设置取消状态 ### > 头文件:\#include <pthread.h> > > int pthread\_setcancelstate (int \_\_state, int \*\_\_oldstate); > \* 功能:设置取消状态 > \* 参数: > int \_\_state - 使能还不使能 > 使能取消线程,PTHREAD\_CANCEL\_ENABLE > int \*\_\_oldstate- 保存老状态 > \* 返回值: > 失败 - 负数绝对值是错误码 ### 5.设置取消方式 ### > 头文件:\#include <pthread.h> > > int pthread\_setcanceltype (int \_\_type, int \*\_\_oldtype); > \* 功能:设置取消方式 > \* 参数: > int \_\_type - 取消方式 > PTHREAD\_CANCEL\_ASYNCHRONOUS - 异步取消 > PTHREAD\_CANCEL\_DEFERRED - 取消延迟 > int \*\_\_oldtype- 保存老方式 > \* 返回值: > 失败 - 负数绝对值是错误码 ### 6.取消线程 ### > 头文件:\#include <pthread.h> > > int pthread\_cancel (pthread\_t \_\_th); > > /\* > \* 功能:取消线程 > \* 参数: > pthread\_t \_\_th - 线程ID > \* 返回值: > 失败 - 负数绝对值是错误码 ## 三 、线程状态转换图片(如图清晰可见) ## ![d4dae73a4bb84ed9bd071bc190c11499.jpeg][] ### ### -------------------- ## 总结 ## 本篇文章针对C/C++ 线程进行详细讲解,希望能够帮到大家! 以后还会给大家展现更多关于嵌入式和C语言的其他重要的基础知识,感谢大家支持懒大王! 希望这篇博客能给各位朋友们带来帮助,最后懒大王请来过的朋友们留下你们宝贵的三连以及关注,感谢你们! [d4dae73a4bb84ed9bd071bc190c11499.jpeg]: https://image.dandelioncloud.cn/pgy_files/images/2024/02/23/46b6168c9ef64c298212369f47131741.png
相关 初识C语言——详细入门(系统性学习day4) 目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍: 特点: 基本构成: 二、认识C语言程序 标准格式: 简单C程序: 三、基本构成分类详细介绍 ( 小鱼儿/ 2024年03月02日 04:22/ 0 赞/ 19 阅读
相关 C/C++进程超详细详解【中部分】(系统性学习day07) 目录 前言 一、守护进程 1.概念 2.守护进程创建的原理(如图清晰可见) 3.守护进程的实现(代码块) 二、dup和dup2 1,复制文件描述符 2 太过爱你忘了你带给我的痛/ 2024年02月27日 05:43/ 0 赞/ 29 阅读
相关 C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9) 目录 前言 一、system V IPC对象图解 1.流程图解: 编辑 2.查看linux内核中的ipc对象: 二、消息队列 1.消息队列的原理 2. 谁借莪1个温暖的怀抱¢/ 2024年02月24日 02:12/ 0 赞/ 22 阅读
相关 C/C++ 线程超详细讲解(系统性学习day10) 目录 前言 一、线程基础 1.概念 2.一个进程中多个线程特征 2.1 线程共有资源 2.2 线程私有资源 3.线程相关的api函数 3.1 创建 桃扇骨/ 2024年02月23日 01:22/ 0 赞/ 27 阅读
相关 超详细Java多线程学习笔记 目录 1、Thread(重点) 2、Runnable(重点) 3、初识并发问题 4、实现Callable接口(了解即 朱雀/ 2022年10月13日 12:33/ 0 赞/ 265 阅读
相关 Java多线程学习(吐血超详细总结) [林炳文Evankaka][Evankaka]原创作品。转载请注明出处[http://blog.csdn.net/evankaka][Evankaka] 写在前面的话:此文只 野性酷女/ 2022年06月13日 09:53/ 0 赞/ 197 阅读
相关 Java多线程学习(吐血超详细总结) [https://www.cnblogs.com/GarfieldEr007/p/5746362.html][https_www.cnblogs.com_GarfieldEr0 蔚落/ 2022年05月29日 04:54/ 0 赞/ 306 阅读
相关 Java多线程学习(吐血超详细总结) [林炳文Evankaka][Evankaka]原创作品。转载请注明出处 [http://blog.csdn.net/evankaka][Evankaka] 梦里梦外;/ 2022年05月24日 03:39/ 0 赞/ 176 阅读
相关 java多线程学习(超详细吐血总结) 转载出处 [作者博客][Link 1] [http://blog.csdn.net/evankaka/article/details/44153709\t1][http_bl 清疚/ 2022年05月19日 10:53/ 0 赞/ 195 阅读
还没有评论,来说两句吧...