嵌入式Linux系统编程学习之二十七线程的创建和退出
创建线程实际上就是确定调用该线程函数的入口点,线程的创建采用函数 pthread_create 。在线程创建以后,就开始运行相关的线程函数,在该函数运行完之后,线程就退出,这也是线程退出的一种方式。另一种线程退出的方式是使用函数 pthread_exit ,这是线程主动退出行为。这里需要注意的是,在使用线程函数时,不能随意使用 exit 退出函数进行出错处理,由于 exit 的作用是使调用进程终止,往往一个进程包括了多个线程,所以线程中通常使用 pthread_exit 函数来代替进程中的退出函数 exit 。
由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程终止而得到释放。正如进程之间可以通过 wait 函数系统调用来同步终止并释放资源一样,线程之间也有类似的机制,那就是 pthread_join 函数。pthread_join 函数可以用于将当前线程挂起,等待某个线程的结束,这个函数是一个线程阻塞函数,调用这个函数的线程将一直等待直到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。
函数原型为:
#include <pthread.h>int pthread_create(pthread_t *thread, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);void pthread_exit(void *retval);
通常形式为:
pthread_t pthid;pthread_create(&pthid, NULL, pthfunc, NULL);或pthread_create(&pthid, NULL, pthfunc, (void *)3);pthread_exit(NULL);或pthread_exit((void *)3); // 3 作为返回值被后面的 pthread_join 函数捕获pthread_join(pthid, (void *)3);
函数 pthread_create 用来创建线程。
参数 thread 是传出参数,保存新线程的标识;
参数 attr 是一个结构体指针,结构中的元素分别指定新线程的运行属性,attr 可以用 pthread_attr_init 等函数设置各成员的值,但通常传入为 NULL 即可。
参数 start_routine 是一个函数指针,指向新线程的入口点函数,线程入口点函数带有一个 void * 的参数由 pthread_create 的第 4 个参数传入;
参数 arg 用于传递给第 3 个参数指向的入口点函数的参数,可以为 NULL ,表示不传递
返回值:成功返回 0;失败返回 -1。
函数 pthread_exit 表示线程的退出,其参数可以被其他线程用 pthread_join 函数捕获。
补充:
编译时需要带上线程库选项:-lpthread
编译时会产生一些警告信息,是因为某些参数的类型不匹配,但这个不影响生成可执行程序,可以不管。
嵌入式Linux系统编程学习之二十七线程的创建和退出相关推荐
- 嵌入式Linux系统编程学习之二常用命令
嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...
- 嵌入式Linux系统编程学习之二十八线程的等待退出
文章目录 一.等待线程退出 二.线程的取消 三.线程终止清理函数 一.等待线程退出 线程从入口点函数自然返回,或者主动调用 pthread_exit 函数都可以让线程正常终止.线程从入口点函数自然 ...
- 嵌入式Linux系统编程学习之二十六多线程概述
文章目录 一.多线程概述 二.线程分类 三.线程创建的Linux实现 一.多线程概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段,这就造成进程在进行切换等操作 ...
- 嵌入式Linux系统编程学习之二十九线程的互斥
文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言 在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...
- 嵌入式Linux系统编程学习之二十四消息队列
文章目录 前言 一.msgget 函数 二.msgsnd 函数 三.msgctl 函数 补充 前言 消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列 ...
- 嵌入式Linux系统编程学习之二十三 System V 共享内存机制
文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言 共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...
- 嵌入式Linux系统编程学习之二十二内存映射
文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言 内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...
- 嵌入式Linux系统编程学习之二十五信号量
文章目录 前言 一.System V IPC 机制:信号量 1. semget 函数 2. semop 函数 3. semctl 函数 二.Posix 有名信号量 前言 信号量与信号量集的概念如下 ...
- 嵌入式Linux系统编程学习之二十一命名管道(FIFO)
文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言 无名管道只能在有亲缘 ...
最新文章
- 数据科学家常用的十大机器学习算法,都在这了!
- Makefile:自动化变量 $@,$^,$<,$?
- 带你揭秘Web前端发展的前景以及技术
- 转载:网口扫盲三:以太网芯片MAC和PHY的关系
- 零基础学习WinCE开发
- Mahmoud and a Dictionary CodeForces - 766D 种类并查集
- mysql正在运行安全文件怎么办_MySQL服务器运行的安全文件化选项,所以它不能执行该语句什么情? 爱问知识人...
- HDFS中心缓存管理
- 可爱的PNG免扣新年装饰素材,让你海报增加节日气氛
- SystemCenter2012SP1实践(12)服务器、网络和存储配置
- BZOJ(本校) 3046 简单数学问题 - 线段树
- C99的新关键字_Bool
- 超级好用的画图吸色工具FastSton Capture
- 分享 野人老师-高级信息系统项目管理师-全部的课程资料
- 程序员常用单词词汇汇总
- 软件工程专业就业方向
- CF581B Luxurious Houses 模拟
- xxx-1.0-SNAPSHOT.jar中没有主清单属性的解决方法
- Spark-RDD实战影评数据分析一
- CSS学习案例(16):网易云音乐导航栏
热门文章
- python网络爬虫 抓取金融分析师名单
- Neo4j配置安装与测试
- linux网线连接树莓派,3、树莓派使用网线连接路由器获取网络的讲解
- php isinstance,Python issubclass和isinstance
- 开关电源磁性元件理论及设计pdf_2020年开关电源需求活跃 通讯运营商已多轮集采...
- linux识别科学计数法,Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]...
- 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)
- 腾讯这套SpringMvc面试题你了解多少?(面试必备)
- 如何添加WebService调用时的用户认证
- Windows命令行(DOS命令)教程