创建线程实际上就是确定调用该线程函数的入口点,线程的创建采用函数 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. 工作随笔之nginx 应用场景
  2. Kotlin plugin should be enabled before ‘kotlin-android-extensions‘
  3. vue的this.$set的作用
  4. 4-30 HTML 细节摘录
  5. 【clickhouse】Application: DB::Exception: Duplicate interserver IO endpoint: DataPartsExchange
  6. 学号 2016-2017-20155329《Java程序设计》课程总结
  7. 遇劣势变蠢、发语音嘲讽人类……OpenAI这些奇葩DOTA操作跟谁学的?
  8. JUC并发编程超详细详解篇
  9. Python设计模式(七)【命令模式】
  10. 汉字在字库中的偏移地址计算、显示方法
  11. 线性代数感悟之4 通过增广矩阵查看解的情况上篇
  12. java 龙卷风_龙卷风在大约37000个请求后停止响应
  13. 【Day5.3】斯里兰卡风格的崖差蒙空寺
  14. 音频编码之aac编码原理
  15. QPBOC——数据认证
  16. python画太极图
  17. iOS 苹果2.1大礼包回复模版-guideline 2.1 Information Needed
  18. 数字后端概念——Via
  19. android 4.2 webview,java-Android(4.4)WebView第二次加载时不显示ifra...
  20. Java实现邮箱验证

热门文章

  1. 时间戳转datetime格式
  2. pandas删除index与某一列有重复值所在的行
  3. 织梦php添加函数调用,dedecms自定义函数及实际案例调用
  4. 要素集获取要素_Excel点文件转面要素
  5. c语言输入日期返回星期几,C语言程序设计: 输入年月日 然后输出是星期几
  6. 九毛九集团java_JAVA数组课后作业
  7. 函数名的使用、闭包、生成器
  8. 【算法总结】积性函数相关
  9. Confluence与Jira安装及后期迁移问题记录
  10. java内存管理总结