1.创建线程
  int pthread_create(pthread_t *restrict_ptid,
              const pthread_attr_t *restrict_attr,
              void *(*start_routine)(void*), void *restrict_arg);
      ptid是一个pthread_t *类型的指针,pthread_t是类似pid_t的数据结构,表示线程ID;attr指明线程创建属性,如果为NULL就使用系统默认属性;start_routine是线程的主函数,它的参数是void *类型的指针,返回值也是void *类型的指针;arg是线程创建者传递给新建线程的参数,也就是start_routine的参数,如果需要向start_routine函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为restrict_arg的参数传入。(若线程创建成功,则返回0。若线程创建失败,则返回出错编号)
  注意:线程创建者和新建线程之间没有fork()调用那样的父子关系,它们是对等关系。调用pthread_create()创建线程后,线程创建者和新建线程哪个先运行是不确定的,特别是在多处理机器上。

2.终止线程
  void pthread_exit(void *value_ptr);
     线程调用pthread_exit()结束自己,参数value_ptr作为线程的返回值被调用pthread_join的线程使用。由于一个进程中的多个线程是共享数据段的,因此通常在线程退出之后,退出线程所占用的资源并不会随着线程的终止而得到释放,但是可以用pthread_join()函数来同步并释放资源。

3.pthread_self():该函数返回调用线程的ID.这个数值与调用 pthread_create 创建本线程时使用的*thread 参数返回的值是一样的。
  注意:Thread IDs 仅仅保证在一个进程内部的唯一性。当一个结束了的线程 joined(使用join等待一个线程结束)之后, 或者一个detached 状态的线程被结束 thread ID可能会被重新使用。 pthread_self()返回的线程ID与 调用 gettid()得到的内核线程ID是不一样的。

4.pthread_equal():比较线程ID,线程ID的大小没有意义。 
  引入原因:在线程中,线程ID的类型是pthread_t类型,由于在Linux下线程采用POSIX标准,所以,在不同的系统下,pthread_t的类型是不同的,比如在ubuntn下,是unsigned long类型,而在solaris系统中,是unsigned int类型。而在FreeBSD上才用的是结构题指针。 所以不能直接使用==判读,而应该使用pthread_equal来判断。

3.取消线程
  int pthread_cancel(pthread_t thread);
  注意:若是在整个程序退出时,要终止各个线程,应该在成功发送 CANCEL指令后,使用 pthread_join函数,等待指定的线程已经完全退出以后,再继续执行;否则,很容易产生 “段错误”。

4.连接线程(阻塞)
  int pthread_join(pthread_t thread, void **value_ptr);
  等待线程thread结束,并设置*value_ptr为thread的返回值。pthread_join阻塞调用者,一直到线程thread结束为止。当函数返回时,被等待线程的资源被收回。如果进程已经结束,那么该函数会立即返回。并且thread指定的线程必须是joinable的。
  线程终止有一下几种方法:
  1.从主函数返回;  
  2.自己调用pthread_exit();
  3.其他线程调用pthread_cancel();
  4.线程所属的进程中任何线程调用exit()导致所有线程结束。

5.分离线程
  int pthread_detach(pthread_t thread);
  分离线程的语意是,线程thread结束后系统可以回收它的私有数据。
  注释:pthread有两种状态joinable状态和unjoinable状态 一个线程默认的状态是joinable,如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己,如:pthread_detach(pthread_self())或者父线程调用pthread_detach(thread_id)结束相应子进程。

最新文章

  1. 介绍开源的.net通信框架NetworkComms框架 源码分析
  2. Javascript获取浏览器版本
  3. 使用AppCompat_v7 21.0.0d的几个兼容问题
  4. 一个想法(续六):IT联盟创业计划:如何进行找钱、寻人、做事?
  5. 团队作业8——第二次项目冲刺(Beta阶段)日志集合处
  6. PCIe设备的配置空间
  7. JBOSS EAP实战(2)-集群、NGINX集成、队列与安全
  8. 高通8x12平台开机画面制作工具
  9. Dynamics 365使用代码发送邮件给指定邮箱地址
  10. SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较
  11. Linux三剑客-SED
  12. Pandas字符串操作及实例应用
  13. Tree 菜单 递归
  14. mysql运用now(3)存储时间到毫秒
  15. AVAudioSession应用指南
  16. C# ashx接收ContentType="text/xml"类型值
  17. URAL 1183 Brackets Sequence
  18. poj 3735 Training little cats(构造矩阵)
  19. console.log()的兼容性
  20. word中手动添加endnote的加载项

热门文章

  1. 第4章 ext文件系统机制原理剖析
  2. XtraBackup的备份原理与应用示例
  3. spring cloud config与eureka配合使用
  4. autocomplate 学习
  5. Java 快速排序法 冒泡排序法 选择排序法 插入排序法
  6. Spring Boot 1.5.* 升级 2.1 - 完善中
  7. java - Jsoup原理
  8. Docker 修改存储路径
  9. Spider-one
  10. a标签禁止跳转或者不跳转的几种实现方式