创建线程实际上就是确定调用该线程函数的入口点,线程的创建采用函数 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系统编程学习之二十七线程的创建和退出相关推荐

  1. 嵌入式Linux系统编程学习之二常用命令

    嵌入式Linux系统编程学习之二常用命令 文章目录 嵌入式Linux系统编程学习之二常用命令 前言 一.常用命令 1.su(用户切换) 2.useradd(添加用户) 3.passwd(修改密码) 4 ...

  2. 嵌入式Linux系统编程学习之二十八线程的等待退出

    文章目录 一.等待线程退出 二.线程的取消 三.线程终止清理函数 一.等待线程退出   线程从入口点函数自然返回,或者主动调用 pthread_exit 函数都可以让线程正常终止.线程从入口点函数自然 ...

  3. 嵌入式Linux系统编程学习之二十六多线程概述

    文章目录 一.多线程概述 二.线程分类 三.线程创建的Linux实现 一.多线程概述   进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段,这就造成进程在进行切换等操作 ...

  4. 嵌入式Linux系统编程学习之二十九线程的互斥

    文章目录 前言 一.创建和销毁锁 二.互斥锁属性 三.锁操作 四.加锁注意事项 五.加锁步骤 前言   在 Posix Thread 中定义了一套专门用于线程互斥的 mutex 函数.mutex 是一 ...

  5. 嵌入式Linux系统编程学习之二十四消息队列

    文章目录 前言 一.msgget 函数 二.msgsnd 函数 三.msgctl 函数 补充 前言   消息队列与 FIFO 很相似,都是一个队列结构,都可以有多个进程往队列里面写信息,多个进程从队列 ...

  6. 嵌入式Linux系统编程学习之二十三 System V 共享内存机制

    文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言   共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...

  7. 嵌入式Linux系统编程学习之二十二内存映射

    文章目录 前言 一.mmap函数 二.munmap函数 三.补充 前言   内存映射函数包括 mmap.munmap 和 msync,其原型为: #include <unistd.h>#i ...

  8. 嵌入式Linux系统编程学习之二十五信号量

    文章目录 前言 一.System V IPC 机制:信号量 1. semget 函数 2. semop 函数 3. semctl 函数 二.Posix 有名信号量 前言   信号量与信号量集的概念如下 ...

  9. 嵌入式Linux系统编程学习之二十一命名管道(FIFO)

    文章目录 前言 一.创建.删除FIFO文件 1. 用函数创建和删除 FIFO 文件 2. 用命令创建和删除 FIFO 文件 二.打开.关闭FIFO文件 三.读写FIFO 前言   无名管道只能在有亲缘 ...

最新文章

  1. 数据科学家常用的十大机器学习算法,都在这了!
  2. Makefile:自动化变量 $@,$^,$<,$?
  3. 带你揭秘Web前端发展的前景以及技术
  4. 转载:网口扫盲三:以太网芯片MAC和PHY的关系
  5. 零基础学习WinCE开发
  6. Mahmoud and a Dictionary CodeForces - 766D 种类并查集
  7. mysql正在运行安全文件怎么办_MySQL服务器运行的安全文件化选项,所以它不能执行该语句什么情? 爱问知识人...
  8. HDFS中心缓存管理
  9. 可爱的PNG免扣新年装饰素材,让你海报增加节日气氛
  10. SystemCenter2012SP1实践(12)服务器、网络和存储配置
  11. BZOJ(本校) 3046 简单数学问题 - 线段树
  12. C99的新关键字_Bool
  13. 超级好用的画图吸色工具FastSton Capture
  14. 分享 野人老师-高级信息系统项目管理师-全部的课程资料
  15. 程序员常用单词词汇汇总
  16. 软件工程专业就业方向
  17. CF581B Luxurious Houses 模拟
  18. xxx-1.0-SNAPSHOT.jar中没有主清单属性的解决方法
  19. Spark-RDD实战影评数据分析一
  20. CSS学习案例(16):网易云音乐导航栏

热门文章

  1. python网络爬虫 抓取金融分析师名单
  2. Neo4j配置安装与测试
  3. linux网线连接树莓派,3、树莓派使用网线连接路由器获取网络的讲解
  4. php isinstance,Python issubclass和isinstance
  5. 开关电源磁性元件理论及设计pdf_2020年开关电源需求活跃 通讯运营商已多轮集采...
  6. linux识别科学计数法,Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]...
  7. 数据结构摧毁线性表用c语言,[简述]数据结构-线性表(c语言实现)
  8. 腾讯这套SpringMvc面试题你了解多少?(面试必备)
  9. 如何添加WebService调用时的用户认证
  10. Windows命令行(DOS命令)教程