线程的创建、等待、退出

多线程开发在Linux平台上已经有成熟的pthread库支持,所以使用pthread库在编译时要加上-pthread。其设计的多线程开发的基本概念主要包含3点:线程、互斥锁、条件。其中线程操作又分线程的创建、退出、等待三种。互斥锁包含4种操作,分别是创建、销毁、加锁和解锁。条件操作有5种,分别是“创建、销毁、触发、广播和等待。

更详细的讲解可以看以下的连接:https://www.cnblogs.com/xiehongfeng100/p/4620852.html

线程创建

函数原型

int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);

参数

pthread_t *restrict tidp:新线程的ID。需要注意的是使用pthread_t定义的变量是unsigned int型,传参的时候要进行类型转换。

pthread_attr_t *restrict attr:线程的属性。可以暂时把它设置为NULL,创建默认属性的线程。

void *(*start_rtn)(void *arg):线程创建需要执行的任务函数。新创建的线程从start_rtn函数的地址开始运行。该函数只有一个无类型指针arg。如果需要start_rtn函数传递的参数不止一个,那么需要将这些参数放入一个结构体中,然后把这个结构体的地址作为arg参数传入。

返回值

创建函数成功返回0,失败返回错误编号。

示例

#include <stdio.h>
#include <pthread.h>
void *func1(void *arg)
{printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int *)arg));
}
int main()
{int param=100;int ret;pthread_t t1;ret=pthread_create(&t1, NULL,func1, (void *)&param);if(ret == 0){printf("main:create t1 successed\n");}printf("main:%ld\n",(unsigned long)pthread_self());while(1);return 0;
}

 线程等待

调用这个函数的线程将一直阻塞,直到指定的此案成调用pthread_exit,从启动例程中返回或被取消。如果例程只是从他的启动例程返回i,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。

可以通过掉用pthread_join自动把线程职位分离状态,这样资源就可以回复。如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。

如果对线程的返回值不感兴趣,可以把rval_ptr置为NULL。在这种情况下,调用pthread_join函数将等待指定的线程终止,但并不获得线程的终止状态。

函数原型

int pthread_join(pthread_t thread, rval_ptr);

参数

pthread_t thread:线程ID

void **rval_ptr:线程收回或被取消的状态等信息

返回值

若成功返回0,否则返回错误编号

线程退出

单个线程可以通过以下三种方式退出,在不终止整个进程的情况下停止它的控制流

  1. 线程只是从启动例程中返回,返回值是
  2. 线程可以被统一进程中的其他线程取消
  3. 线程调用pthread_exit;

函数原型

int pthread_exit(void *rval_ptr);

参数

void *rval_ptr:是一个无类型指针,与传给启动例程的单个参数类似。进程中的其他线程可以通过pthread_join函数访问到这个指针。

返回值

线程的退出码

示例

#include <stdio.h>
#include <pthread.h>
void *func1(void *arg)
{static int ret=10;printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int *)arg));pthread_exit((void *)&ret);}
int main()
{int param=100;int *pret;int ret;pthread_t t1;ret=pthread_create(&t1, NULL,func1, (void *)&param);if(ret == 0){printf("main:create t1 successed\n");}printf("main:%ld\n",(unsigned long)pthread_self());pthread_join(t1,(void **)&pret);printf("main: ti quit:%d\n",*pret);return 0;
}

除了可以传递整型变量,也可以传字符串等其他类型变量,但是需要注意的是,使用pthread_exit函数返回的变量要用static进行声明,不然传递的数据会出错。

#include <stdio.h>
#include <pthread.h>
void *func1(void *arg)
{static int ret=10;static char *p="t1 is run out";printf("t1:%ld thread is creart\n",(unsigned long)pthread_self());printf("t1:param is %d\n",*((int *)arg));pthread_exit((void *)p);}
int main()
{int param=100;char *pret=NULL;int ret;pthread_t t1;ret=pthread_create(&t1, NULL,func1, (void *)&param);if(ret == 0){printf("main:create t1 successed\n");}printf("main:%ld\n",(unsigned long)pthread_self());pthread_join(t1,(void **)&pret);printf("main: ti quit:%s\n",pret);return 0;
}

线程ID获取

  对于线程ID比较,为了可移植操作,我们不能简单地把线程ID当作整数来处理,因为不同系统对线程ID的定义可能不一样。

函数原型

pthread_t pthread_self(void);

返回值

调用线程的ID

线程ID比较

函数原型

int pthread_equal(pthread_t tid1, pthread_t tid2);

返回值

若相等则返回非0值,否则返回0

 

 

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

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

相关文章

python基础速通

1. 梳理&#xff1a;目前学习了哪几种数据类型&#xff0c; 每一个数据类型定义一个变量&#xff0c;并输出内容以及类型 # 数据类型 # 整型 int_data 1 print(int_data, type(int_data)) # 浮点型 float_data 1.2 print((float_data, type(float_data))) # 复数 complex_da…

java高级之单元测试、反射

1、Junit测试工具 Test定义测试方法 1.被BeforeClass标记的方法,执行在所有方法之前 2.被AfterCalss标记的方法&#xff0c;执行在所有方法之后 3.被Before标记的方法&#xff0c;执行在每一个Test方法之前 4.被After标记的方法&#xff0c;执行在每一个Test方法之后 public …

什么情况造成互斥锁死锁

由于互斥锁的使用不当&#xff0c;导致多个线程无法进行下一步的代码运行&#xff0c;也就是说竞争锁的两个线程互相锁住&#xff0c;导致整个进程无法往下运行。 举个例子&#xff1a; 两个锁&#xff0c;两个线程&#xff0c;两个线程运行的条件都是需要同时获得这两把锁&a…

高防CDN:游戏应用抵御DDoS攻击的坚固堡垒

在当今的数字时代&#xff0c;游戏应用已经成为人们生活的一部分&#xff0c;而面临的网络威胁也日益复杂。其中&#xff0c;DDoS&#xff08;分布式拒绝服务&#xff09;攻击是游戏应用的一项严重威胁&#xff0c;可能导致游戏服务不可用&#xff0c;用户流失&#xff0c;以及…

AI:54-基于深度学习的树木种类识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

Spring AOP 简介

一、Spring AOP AOP 是一种思想&#xff0c;而 Spring AOP 是一个框架&#xff0c;提供了一种对 AOP 思想的实现。 1、什么是 AOP&#xff1f; AOP&#xff08;Aspect Oriented Programming&#xff09;&#xff1a;是一种编程思想&#xff0c;表示面向切面编程。指的是对某…

如何快速导出、备份微信通讯录好友联系人微信号

6-9 如果因工作需要&#xff0c;你有多个微信&#xff0c;并且你的业务开发的客户都在这些微信里&#xff0c;将会面临一个问题&#xff0c;那就是备份问题&#xff0c;因为通过微信做业务&#xff0c;如果遇到微信不小心被封号&#xff0c;或者离职的交接等情况&#xff0c;客…

pg14-sql基础(三)-分组

分组 SELECT hire_date, COUNT(*) FROM employees GROUP BY hire_date;SELECT extract(year from hire_date), COUNT(*) FROM employees GROUP BY extract(year from hire_date); -- GROUP BY 1;SELECT extract(year from hire_date), department_id, COUNT(*) FROM employees…

逆向学习记录(3)工具介绍jadx、gda和jeb

1、jadx 下载地址如下&#xff0c;目前最新版本为v1.4.7&#xff0c;改成想要下载的版本号就能下载对应的版本。 https://github.com/skylot/jadx/releases/tag/v1.4.7 下载后解压&#xff0c;进入对应路径的bin文件夹内&#xff0c;运行jadx-gui.bat。 2、gda 下载地址和gi…

抵押贷款巨头 Mr. Cooper 遭受网络攻击,影响 IT 系统

导语 近日&#xff0c;美国抵押贷款巨头 Mr. Cooper 遭受了一次网络攻击&#xff0c;导致该公司的 IT 系统受到影响。这一事件引起了广泛的关注&#xff0c;使得 Mr. Cooper 的在线支付平台无法正常运行。本文将为大家详细介绍这次网络攻击事件的具体情况及其对用户和公司造成的…

Redis02-持久化策略

目录 RDB&#xff08;Redis DataBase Backup file&#xff09; RDB执行原理 AOF&#xff08;Append-Only File&#xff09; RDB和AOF对比 Redis支持多种持久化方式&#xff0c;以确保数据在内存中持久存储&#xff0c;以便在Redis服务器重启时数据不会丢失。Redis中持久化的…

1.计算机系统概述

目录 一. 计算机的发展 二. 计算机硬件的基本组成 三. 各个硬件的工作原理 &#xff08;1&#xff09;主存储器 &#xff08;2&#xff09;运算器 &#xff08;3&#xff09;控制器 &#xff08;4&#xff09;一个例子 四. 计算机系统的层次结构 五. 计算机的性能指标…