C/C++ 线程超详细讲解(系统性学习day10)

目录

前言

一、线程基础

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
 * 返回值:
    失败 - 负数绝对值是错误码

三 、线程状态转换图片(如图清晰可见)


总结

        本篇文章针对C/C++ 线程进行详细讲解,希望能够帮到大家!

        以后还会给大家展现更多关于嵌入式和C语言的其他重要的基础知识,感谢大家支持懒大王!

       希望这篇博客能给各位朋友们带来帮助,最后懒大王请来过的朋友们留下你们宝贵的三连以及关注,感谢你们!
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/155361.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django实现音乐网站 ⒆

使用Python Django框架做一个音乐网站&#xff0c; 本篇主要为排行榜功能及音乐播放器部分功能实现。 目录 排行榜列表 设置路由 视图处理 模板渲染 设置跳转入口 播放器功能开发 设置路由 模板页面 脚本渲染 列表渲染和播放器实现 音乐播放器列表展示关闭 总结 排…

Selenium+Pytest自动化测试框架

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象&#xff0c;封装继承 一定的selenium基础——本篇不讲selenium&#xff0c;不会的可以自己去看selenium中文翻译网 测试框架简介 测试框架有什么优点呢&#xff1a; 代码复用率高&…

百度SEO优化全攻略(提高网站排名的5个方面)

百度SEO入门介绍&#xff1a; 随着互联网的不断发展&#xff0c;SEO已经成为网站优化的重要一环。而百度作为中国最大的搜索引擎&#xff0c;其SEO优化更是至关重要。SEO不仅能够提高网站排名&#xff0c;还能够提高网站流量、用户体验以及品牌知名度。因此&#xff0c;掌握百…

代码混淆界面介绍

代码混淆界面介绍 代码混淆功能包括oc&#xff0c;swift&#xff0c;类和函数设置区域。其他flutter&#xff0c;混合开发的最终都会转未oc活着swift的的二进制&#xff0c;所以没有其他语言的设置。 代码混淆功能分顶部的显示控制区域&#xff1a;显示方式&#xff0c;风险等…

重置Mac电脑的SMC怎么操作,重置SMC方法分享~

SMC 负责管理 Mac 上的电源。重置 SMC 可以解决一些与电源或散热管理相关的不常见问题。今天重置SMC教程给大家分享一下&#xff0c;需要的小伙伴看过来&#xff01; 如何判断您是不是需要重置 SMC 若出现以下症状&#xff0c;则表明可能需要重置 SMC&#xff1a; 电池无法充电…

“Python+”集成技术高光谱遥感数据处理与机器学习深度应用丨高光谱数据预处理-机器学习-深度学习-图像分类-参数回归等12个专题

目录 第一章 高光谱数据处理基础 第二章 高光谱开发基础&#xff08;Python&#xff09; 第三章 高光谱机器学习技术&#xff08;python&#xff09; 第四章 典型案例操作实践 更多应用 本教程提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 涵盖高光谱遥感…

新鲜速递:Spring Cloud Alibaba环境在Spring Boot 3时代的快速搭建

了解 首先&#xff0c;Spring Cloud Alibaba使用的是Nacos作为服务注册和服务发现的中间件。 能力在提供者那里&#xff0c;而消费者只需知道提供者提供哪些服务&#xff0c;而无需关心提供者在哪里&#xff0c;实际调用过程如下图 准备工作 1、需要下载并安装Nacos最新版…

3d tiles规范boundingVolume属性学习

3d tiles的瓦片&#xff08;Tiles&#xff09;包含一些属性&#xff0c;其中第一项是boundingVolume&#xff1b;下面学习boundingVolume&#xff1b; boundingVolume&#xff0c;这个翻译为边界范围框&#xff0c;如果直译为边界体积可能有问题&#xff0c;其实就是包围盒的意…

VS2019:无法启动程序xxx.exe。系统找不到指定的文件。

原因&#xff1a; 我把Debug目录/Release目录下已经生成的.exe删除了&#xff0c; 但VS2019的配置文件记录的是它已经生成过了&#xff0c; 所以它会直接去找对应的生成文件&#xff0c;找不到&#xff0c;就出现了这个错误。 解决方法&#xff1a; 在解决方案的对应项目位置右…

nodejs+vue宠物店管理系统

例如&#xff1a;如何在工作琐碎,记录繁多的情况下将宠物店管理的当前情况反应给管理员决策,等等。在此情况下开发一款宠物店管理系统小程序&#xff0c; 困扰管理层的许多问题当中,宠物店管理也是不敢忽视的一块。但是管理好宠物店又面临很多麻烦需要解决,于是乎变得非常合乎时…

PDF编辑软件哪个好用?PDF文档怎么编辑修改内容

在生活中&#xff0c;为了方便文件传输&#xff0c;会将文件扫描或转换成PDF格式&#xff0c;但是如果需要编辑修改会比较麻烦&#xff0c;这时一款好用的PDF编辑器显得十分重要。今天就带大家了解下PDF编辑软件哪个好用&#xff0c;PDF文档怎么编辑修改内容。 一、PDF编辑软件…

windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)

因为小项目需要创建windows服务&#xff0c;安装微软官方示例一切都挺顺利&#xff0c;代码运行后发现配置的信息在系统里显示乱码。打开注册表发现的确是乱码。这就排除软件读取得问题&#xff0c;而是调用ChangeServiceConfig系统函数写入时就发生了乱码。让我在网上查找了一…

【AI】Interesting Applications

文章目录 【盘古】【嗜睡检测】【3D AI 生成】多模态——指哪打哪【AlphaDev&#xff1a;汇编版 AlphaZero】【ChatExcel】 【盘古】 2023年7月&#xff0c;华为正式发布盘古大模型3.0&#xff0c;并提出3层模型架构。 L0&#xff1a;基础大模型&#xff0c;包括自然语言、视觉…

tomcat服务tomcat多实例部署

tomcat服务&&tomcat多实例部署 文章目录 tomcat服务&&tomcat多实例部署1.简介2.优缺点优点&#xff1a;缺点&#xff1a; 3.工作原理4.工作流程5.tomcat服务部署5.1.java环境安装5.2.拉取tomcat软件包5.3.解压部署5.4.启动tomcat服务5.5.访问tomcat的web页面5.…

C#,工业化软件与院校软件的对比及编程语言的选择建议

飞机发动之之一&#xff0c;涡轮喷气航空发动机&#xff08;JET ENGINE&#xff09; 火箭发动机之一&#xff0c;俄罗斯RD-180煤油和液氧发动机&#xff08;ROCKET ENGINE&#xff09; 1 飞机发动机与火箭发动机的简明对比 2 工业软件与院校软件的简单对比 除了以上类似的对比…

JAVA设计模式-装饰者模式

一.概念 装饰器模式(Decorator Pattern)&#xff0c;动态地给一个对象添加一些额外的职责&#xff0c;就增加功能来说&#xff0c;装饰器模式比生成子类更灵活。 —-《大话设计模式》 允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其结构。这种类型的设计模式属…

银河麒麟安装arm架构mysql8

1. 准备工作 2. 查看麒麟系统版本 使用命令 Linux version 4.19.90-25.21.v2101.ky10.aarch64 (KYLINSOFTlocalhost.localdomain) (gcc version 7.3.0 (GCC)) #1 SMP Wed Sep 28 16:37:42 CST 2022可以看出这是麒麟 v10 &#xff0c;aarch64 &#xff08;ARM 架构的&#xff…

排序算法-冒泡排序法(BubbleSort)

排序算法-冒泡排序法&#xff08;BubbleSort&#xff09; 1、说明 冒泡排序法又称为交换排序法&#xff0c;是从观察水中的气泡变化构思而成的&#xff0c;原理是从第一个元素开始&#xff0c;比较相邻元素的大小&#xff0c;若大小顺序有误&#xff0c;则对调后再进行下一个…

Java实现B树

1.介绍 B树是一种自平衡的搜索树数据结构&#xff0c;常用于数据库和文件系统中的索引结构。它具有以下好处和功能&#xff1a; 高效的查找操作&#xff1a;B树的特点是每个节点可以存储多个关键字&#xff0c;并且保持有序。通过在节点上进行二分查找&#xff0c;可以快速定位…

Ubuntu22.04.3安装教程

虚拟机系列文章 VMware Workstation Player 17 免费下载安装教程 VMware Workstation 17 Pro 免费下载安装教程 windows server 2012安装教程 Ubuntu22.04.3安装教程 FTP服务器搭建 Ubuntu22.04.3安装教程 虚拟机系列文章前言Ubuntu22.04.3安装&#xff08;图文&#xff09; 前…