返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C/C++ 线程超详细讲解(系统性学习day10)
  • 763
分享到

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

学习c语言c#开发语言 2023-10-18 14:10:42 763人浏览 安东尼
摘要

目录 前言 一、线程基础 1.概念  2.一个进程中多个线程特征 2.1 线程共有资源 2.2 线程私有资源   3.线程相关的api函数  3.1 创建线程 创建线程实例代码如下:  需要特别注意的是: -lpthread和-pthre

目录

前言

一、线程基础

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
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 #include #include 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 #include #include #include 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 #include #include #include 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

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

int pthread_cond_wait (pthread_cond_t * __cond, pthread_mutex_t *__mutex);
 * 功能:条件休眠,挂起线程(调用该函数的线程被阻塞了,函数不返回,且休眠状态)
 * 参数:
    pthread_cond_t * __cond - 指向条件变量
    pthread_mutex_t *__mutex- 指向互斥
 * 返回值:
    失败:负数,绝对值是错误码

3.唤醒线程 

头文件:#include

int pthread_cond_signal (pthread_cond_t *__cond);
 * 功能:唤醒线程(调用该函数的唤醒被pthread_cond_wait阻塞的线程)
 * 参数:
    pthread_cond_t * __cond - 指向条件变量
 * 返回值:
    失败:负数,绝对值是错误码

4.设置取消状态 

头文件:#include

int pthread_setcancelstate (int __state, int *__oldstate);
 * 功能:设置取消状态
 * 参数:
    int __state    - 使能还不使能
            使能取消线程,PTHREAD_CANCEL_ENABLE
    int *__oldstate- 保存老状态
 * 返回值:
    失败 - 负数绝对值是错误码

 5.设置取消方式

头文件:#include

int pthread_setcanceltype (int __type, int *__oldtype);
 * 功能:设置取消方式
 * 参数:
    int __type    - 取消方式
            PTHREAD_CANCEL_ASYNCHRONOUS - 异步取消
            PTHREAD_CANCEL_DEFERRED - 取消延迟
    int *__oldtype- 保存老方式
 * 返回值:
    失败 - 负数绝对值是错误码

6.取消线程 

头文件:#include

 int pthread_cancel (pthread_t __th);

/*
 * 功能:取消线程
 * 参数:
    pthread_t __th - 线程ID
 * 返回值:
    失败 - 负数绝对值是错误码

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


总结

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

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

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

来源地址:https://blog.csdn.net/weixin_58070962/article/details/133765391

--结束END--

本文标题: C/C++ 线程超详细讲解(系统性学习day10)

本文链接: https://lsjlt.com/news/431328.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C/C++ 线程超详细讲解(系统性学习day10)
    目录 前言 一、线程基础 1.概念  2.一个进程中多个线程特征 2.1 线程共有资源 2.2 线程私有资源   3.线程相关的api函数  3.1 创建线程 创建线程实例代码如下:  需要特别注意的是: -lpthread和-pthre...
    99+
    2023-10-18
    学习 c语言 c# 开发语言
  • C/C++进程超详细详解【中部分】(系统性学习day07)
    目录 前言 一、守护进程 1.概念 2.守护进程创建的原理(如图清晰可见)  3.守护进程的实现(代码块) 二、dup和dup2 1,复制文件描述符 2.文件描述符重定向 三、系统日志 1,打开日志 2,向日志中写消息 3,关闭日志 四,...
    99+
    2023-10-05
    学习 c语言 c# 开发语言
  • C/C++网络编程基础知识超详细讲解上部分(系统性学习day11)
    目录 前言 一、网络的含义与构成 含义: 构成:  二、网络的体系结构 1>OSI七层模型 2>TCP/IP协议体系结构  3>数据经过体系结构,怎么封装  4>端口号 5>大小端序 6>TCP/UDP传输层的协议  三、系统函数API学...
    99+
    2023-10-21
    网络 学习 c语言 c# 开发语言
  • C语言超详细讲解线性表
    目录1. 顺序表1.1 管理结点1.2 顺序表的插入1.3 顺序表的删除1.4 顺序表的扩容2. 链表2.1 定义2.2 头部插入2.3 尾部插入2.4 任意位置插入2.5 任意位置...
    99+
    2024-04-02
  • C++可扩展性与多线程超详细精讲
    目录一、可扩展性和多线程二、线程示例一、可扩展性和多线程 基于 Boost.Asio 之类的库开发程序与通常的 C++ 风格不同。可能需要更长时间才能返回的函数不再按顺序调用。 Bo...
    99+
    2022-11-13
    C++可扩展性与多线程 C++多线程 C++可扩展性
  • C# 多线程详细讲解
    多线程是指在一个程序中同时执行多个线程,每个线程可以独立执行不同的任务。在 C# 中,可以使用 System.Threading 命...
    99+
    2023-09-09
    C#
  • C++BoostUuid超详细讲解
    目录一、说明二、Boost.Uuid库示例和代码一、说明 Boost.Uuid 为 UUID 提供生成器。 UUID 是不依赖于中央协调实例的通用唯一标识符。例如,没有数据库存储所有...
    99+
    2022-12-08
    C++ Boost Uuid C++ Uuid标识符
  • C++BoostUtility超详细讲解
    目录一、说明二、Boost.Utility库示例和代码一、说明 Boost.Utility 库是杂项、有用的类和函数的集合,它们太小而无法在独立库中维护。虽然实用程序很小并且可以快速...
    99+
    2022-12-08
    C++ Boost Utility C++ Utility库
  • C++ Boost Assign超详细讲解
    目录说明Exercise说明 Boost.Assign Boost.Assign 库提供了帮助函数来初始化容器或向容器添加元素。如果需要将许多元素存储在一个容器中,这些函数尤其有用。...
    99+
    2022-12-09
    C++ Boost Assign C++ Assign库
  • C++超详细讲解泛型
    目录1.了解泛型编程2.函数模板2.1简单示例2.2多个模板参数2.3模板实例化2.4模板和普通函数同时存在2.5函数模板不支持定义和声明分离3.类模板3.1简单示例3.2成员函数声...
    99+
    2024-04-02
  • C++学习之线程详解
    目录开篇线程的状态多线程的构建计算时间一、程序运行时间二、chrono共享资源和互斥锁condition_variable线程池总结开篇 多线程是开发中必不可少的,往往我们需要多个任...
    99+
    2024-04-02
  • 超详细讲解Linux C++多线程同步的方式
    目录一.互斥锁1.互斥锁的初始化2.互斥锁的相关属性及分类3.测试加锁函数二.条件变量1.条件变量的相关函数三.读写锁1)初始化的销毁读写锁2)以写的方式获取锁,以读的方式获取锁,释放读写锁四.信号量1)信号量初始化2)...
    99+
    2022-06-04
    Linux C++多线程同步 Linux C++多线程同步方式
  • C语言超详细讲解数据结构中的线性表
    目录前言一、分文件编写1、分文件编写概念2、代码展示二、动态分布内存malloc1、初识malloc2、使用方法三、创建链表并进行增删操作1、初始化链表2、在链表中增加数据3、删除链...
    99+
    2024-04-02
  • C++超详细讲解标准库
    目录一、有趣的重载二、C++ 标准库三、小结一、有趣的重载 操作符 << 的原生意义是按位左移,例:1 <<2; 其意义是将整数 1 按位左移2位,即:000...
    99+
    2024-04-02
  • C++BoostPropertyTree示例超详细讲解
    目录一、提要二、应用示例练习一、提要 借助类 boost::property_tree::ptree,Boost.PropertyTree 提供了一个树结构来存储键/值对。树形结构意...
    99+
    2022-11-13
    C++ Boost PropertyTree C++ Boost PropertyTree示例
  • C++BoostVariant示例超详细讲解
    目录一、提要二、示例一、提要         Boost.Variant 提供了一个类似于 unio&...
    99+
    2022-11-13
    C++ Boost Variant C++ Boost Variant示例
  • C++BoostOptional示例超详细讲解
    目录一、概述二、Boost.Optional一、概述 数据结构类似于容器,因为它们可以存储一个或多个元素。但是,它们与容器不同,因为它们不支持容器通常支持的操作。例如,使用本部分介绍...
    99+
    2022-11-13
    C++ Boost Optional C++ Boost Optional示例
  • 超详细讲解Java线程池
    目录池化技术池化思想介绍池化技术的应用如何设计一个线程池Java线程池解析ThreadPoolExecutor使用介绍内置线程池使用ThreadPoolExecutor解析整体设计线...
    99+
    2024-04-02
  • C++超详细讲解智能指针
    目录一、内存泄漏-永恒的话题二、深度思考三、智能指针分析四、小结一、内存泄漏-永恒的话题 动态申请堆空间,用完后不归还C++ 语言中没有垃圾回收的机制指针无法控制所指堆空间的生命周期...
    99+
    2024-04-02
  • C++超详细讲解函数对象
    目录一、客户需求二、存在的问题三、解决方案四、函数对象五、小结一、客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 下面来看第一个...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作