返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言由浅入深讲解线程的定义
  • 191
分享到

C语言由浅入深讲解线程的定义

2024-04-02 19:04:59 191人浏览 安东尼
摘要

目录线程的概念线程的创建线程的终止线程标识的比较线程的取消线程等待线程分离线程的概念 可以简单理解为一个正在独立运行的函数 注: 1.posix线程是一套标准吗,而不是实现 2.线程

线程的概念

可以简单理解为一个正在独立运行的函数

注:

1.posix线程是一套标准吗,而不是实现

2.线程标识: phread_t,可能是整形也可能是结构体指针等

*简单介绍关于线程标识的函数*
 *pthread_equarl() ;判断两个线程标识是否相等*
*pthread_self();返回自身的线程标识* 

线程的创建

pthread_creat();

int pthread_create(

pthread_t *restrict tidp, //新创建的线程ID指向的内存单元。

const pthread_attr_t *restrict attr, //线程属性,默认为NULL

void *(*start_rtn)(void *), //新创建的线程从start_rtn函数的地址开始运行

void *restrict arg //默认为NULL。若上述函数需要参数,将参数放入结构中并将地址作为arg传入。);

线程的调度取决于调度器策略

# include<stdlib.h>
# include<pthread.h>
static void* func(void* p)
{
 puts("thread is working");
 return NULL;
}
int main()
{
  pthread_t tid;
  int err;
  puts("begin!");
  err = pthread_create(&tid,NULL,func,NULL);
  if(err)
  {
   exit(-1);
  }
  puts("end!");
  exit(0);
}

线程的终止

3种方式 :

1)线程从启动历程返回,返回值就是线程的退出码

2)线程可以被同一进程中的其他线程取消

3)线程可以调用 pthread)exit()函数

线程退出函数

void pthread_exit(void *value_ptr);

线程标识的比较

获取线程号

pthread_t pthread_self(void);

比较

int pthread_equal(pthread_t t1, pthread_t t2);

线程的取消

int pthread_cancel(pthread_t thread);

取消有两种状态 : 允许和不允许

允许取消又分为: 异步cancel , 推迟 cancel(默认) -> 推迟到cancel点

cancel点: posix定义的canceldian 都是可能引发阻塞的系统调用

pthread_setcancelstate(int );//设置是否允许取消

pthread_setcanceltype(); //设置取消方式 异步还是推迟

注:pthread_cancel 调用具有具有一定的延时性,因为cancel点: posix定义的canceldian 都是可能引发阻塞的系统调用,并不会立即被处理,不建议当线程立即被创建后立即进行cancel取消(线程创建,并不会立即被调度);也不建议在线程退出前执行线程cancel取消(线程可能在取消之前就已经退出了);建议在线程执行中进行cancel取消线程

void pthread_testcancel(void); //本函数为设置取消点

当不关心线程的返回信息时可以直接使用线程分离函数进行回收

反之,需要获取线程的返回值时,可以使用线程等待

线程等待

int pthread_join(pthread_t thread, void **value_ptr);

第一个参数是线程标识,第二是传出型参数用来获取线程的返回值

注意:

  • 调用该函数的线程将挂起等待,直到id为thread的线程终止
  • 这里获取的线程退出信息并没有终止信号信息,而终止信号信息是对于整个进程来说的,如果线程收到信号崩溃也会导致整个进程也崩溃
  • thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的

终止获取的状态情况:

  • 如果thread线程通过return返回,value_ ptr所指向的单元里存放的是thread线程函数的返回值
  • 如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数PTHREAD_ CANCELED
  • 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数
  • 如果对thread线程的终止状态不感兴趣,可以传NULL给value_ ptr参数

线程分离

int pthread_detach(pthread_t thread);

默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏

如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源

注:

可以是线程组内其他线程对目标线程进行分离,也可以是线程自己分离:

pthread_detach(pthread_self());

joinable和分离是冲突的,一个线程不能既是joinable又是分离的

线程的分离也是具有一定延时性,分离之后如果再进行等待那么得到返回的结果是未定义的

线程分离后只是回收的时候自动进行回收,如果主线程先退出,那么整个进程也会退出;如果分离的线程执行崩溃,同样的整个进行也会崩溃

到此这篇关于C语言由浅入深讲解线程的定义的文章就介绍到这了,更多相关C语言线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言由浅入深讲解线程的定义

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

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

猜你喜欢
  • C语言由浅入深讲解线程的定义
    目录线程的概念线程的创建线程的终止线程标识的比较线程的取消线程等待线程分离线程的概念 可以简单理解为一个正在独立运行的函数 注: 1.posix线程是一套标准吗,而不是实现 2.线程...
    99+
    2024-04-02
  • C语言由浅入深讲解文件的操作下篇
    目录文件的顺序读写字符输入输出fgetc和fputcfgetcfputc:文本行输入输出函数fgets和fputsfgets:fputs:格式化输入输出函数fscanf和fprint...
    99+
    2024-04-02
  • C语言由浅入深讲解文件的操作上篇
    目录为什么使用文件什么是文件文件名关于文件的一些概念文件函数fopenfclose实例代码绝对路径文件的打开方式文件操作流程为什么使用文件 前面写的通讯录,增加人数退出程序后,数据就...
    99+
    2024-04-02
  • C语言由浅入深理解指针
    目录1. 相关概念2. 指针的定义方法3. 指针的分类4. 指针和变量的关系5. 指针与数组的关系6. 指针的运算1. 相关概念 操作系统给每个存储单元分配了一个编号,从ox00 0...
    99+
    2024-04-02
  • C语言深入讲解宏的定义与使用方法
    目录一、C语言中的宏定义二、宏定义表达式三、宏表达式与函数的对比四、有趣的问题五、强大的内置宏六、小结一、C语言中的宏定义 #define是预处理器处理的单元实体之一#define ...
    99+
    2024-04-02
  • C语言由浅入深了解变量的应用
    目录1. 变量的存储类别内存虚拟内存分区(运行程序时进行分区) 2. 全局变量普通的全局变量静态全局变量3. 局部变量普通局部变量静态局部变量4. const不可赋值变量5...
    99+
    2024-04-02
  • C语言深入浅出讲解指针的使用
    目录一、利用指针倒序字符串二、题目实例三、总结一、利用指针倒序字符串 void _reversal(char* left, char* right) { while (lef...
    99+
    2024-04-02
  • C语言深入浅出讲解顺序表的实现
    目录1.线性表2.顺序表2.1 概念及结构2.2 提供接口2.3 接口实现今天起开始编写数据结构中的各种数据结构及算法的实现,说到顺序表,我们首先得了解下线性表。 1.线性表 线性表...
    99+
    2024-04-02
  • C语言宏定义的扩展定义讲解
    目录1. 常量宏定义2. 定义宏函数3. 宏定义和#号结合4. 宏定义和两个#结合5. 宏定义和do…while()的结合6. #ifdef…#else&...
    99+
    2022-12-27
    C语言宏定义 C语言宏定义扩展
  • 由浅入深讲解python中的yield与generator
    前言 本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,genera...
    99+
    2022-06-04
    由浅入深 python generator
  • 由浅入深讲解vue2和vue3的区别
    目录前言vue2 vs vue3 对比双向绑定更新实例化生命周期获取props数据和方法的定义给父组件传值emitwatchEffect组件通信注意路由总结前言 vue2和vu3之前...
    99+
    2023-02-08
    vue2和vue3的区别是什么 vue2和vue3区别大吗 vue2和vue3原理的区别
  • C语言深入浅出讲解直接插入排序算法的实现
    目录直接插入排序1.基本思想2.算法实现3.时间复杂度插入排序分为两种:直接插入排序&希尔排序 直接插入排序 1.基本思想 直接插入排序是一种简单的插入排序算法,其基本思想是...
    99+
    2024-04-02
  • C语言深入讲解函数的使用
    目录关于函数1. 函数的定义形式2. 函数的声明3. 返回语句4. 函数参数4.1 形式参数(传值调用)4.2 实际参数(传址调用)4.3 无参数5. 函数的调用5.1 嵌套调用5....
    99+
    2024-04-02
  • C语言深入讲解链表的使用
    目录一、链表的概念二、链表的分类1. 单向或者双向链表2. 带头或者不带头(是否有自带哨兵位头结点)3. 循环或者非循环链表4. 无头单向非循环链表和带头双向循环链表3、链表的实现(...
    99+
    2024-04-02
  • C语言中volatile关键字的深入讲解
    1. 什么是volatile关键字? volatile用于声明一个变量,告诉编译器该变量值容易发生改变,在编译、读取、存储该变量的时候都不要做任何优化,因此编译后的程序每次需要存储...
    99+
    2024-04-02
  • C语言深入浅出解析二叉树
    目录树概念及结构相关概念树的表示树在实际中的运用(表示文件系统的目录树结构)二叉树概念及结构概念需要注意的特殊二叉树二叉树的性质二叉树的存储结构顺序存储链式存储总结树概念及结构 树是...
    99+
    2024-04-02
  • Java由浅入深全面讲解方法的使用
    目录一、方法的概念及其使用1.1、什么是方法1.2、方法的定义1.3、方法调用的执行过程1.4、实参和形参的关系(重要)二、方法的重载2.1、为什么需要方法重载2.2、方法重载的定义...
    99+
    2024-04-02
  • C语言深入了解自定义数据类型的使用
    目录一、自定义数据类型(上)二、自定义数据类型(中)​​​​​三、自定义数据类型(下)​​​​​一、自定义数据类型(上) 类型命名关键字 (typedef) C语言中可以对类型赋予新...
    99+
    2024-04-02
  • C语言之预处理命令的深入讲解
    c提供的预处理功能有: 宏定义 文件包含 条件编译 为了与其她c语句区分,命令经常以符号“#”开头。 宏定义 #define 标识符 字符串 可以避免反复输入字符串...
    99+
    2024-04-02
  • C语言深入讲解函数参数的使用
    目录一、函数参数二、程序的顺序点三、小结-上四、调用约定五、可变参数六、可变参数的限制七、小结-下一、函数参数 函数参数在本质上与局部变量相同在栈上分配空间函数参数的初始值是函数调用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作