Pthread线程使用详解

文中先讲解函数,再运行实例,以及一些注意事项。

一、使用pthread创建一个子线程并传入参数

函数pthread_create,使用man 3 pthread_create查看介绍。

1.1 函数基本用法讲解

1.1.1 pthread_create

#include <pthread.h>

/*在当前进程中创建一个新的线程,新线程的运行会调用start_routine函数,同时传递arg参数给
*start_routine函数
*/
int pthread_create(pthread_t *thread, //新线程句柄
                              const pthread_attr_t *attr,//新线程的属性
                              void *(*start_routine) (void *), //新线程调用的函数
                              void *arg);//传递给新线程的参数

函数描述:
通过pthread_create创建的新线程,有收下四种方法退出线程:

  1. 调用pthread_exit(value),value是退出状态值,该值对同进程中调用了pthread_join()的线程是可见的;
  2. start_routine返回,在该函数中调用return语句
  3. 线程被cancel,参见pthread_cancel()
  4. 任何线程调用了exit方法,或者主线程在main函数中返回,都会导致所有线程的退出。

attr参数是一个pthread_attr_t结构体,它在线程被创建时被用来设定新线程的属性。这个结构体的初始化是通过pthread_attr_init()函数。如果该参数为空,那么新线程会使用默认的属性参数。

pthread_create函数调用返回之前,新线程的内存指针会赋给thread参数,表示线程的ID,这个ID的作用是在后续可以调用针对该线程的其它pthreads函数。

返回值
成功返回0,失败返回一个错误编号,同时thread参数也不会被赋值。

pthread_join

函数描述

#include <pthread.h>

int pthread_join(pthread_t thread, void **retval);

pthread_join函数会等待指定的线程结束,如果指定的线程已经线束,那么它会立即返回。指定的线程必须是joinable的。也就是说,pthread_join()函数会一直阻塞调用线程,直到指定的线程tid终止。当pthread_join()返回之后,应用程序可回收与已终止线程关联的任何数据存储空间,(另外也可设置线程attr属性,当线程结束时直接回收资源)如果没有必要等待特定的线程终止之后才进行其他处理,则应当将该线程分离pthread_detach()

如果retval不为空,那么该函数会拷贝退出状态值到retval指向的内存中,如果目标thread被cancel了,retval的值为PTHREAD_CANCELED

返回值
成功返回0,错误返回错误码

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述 线程和进程本质上来说都属于一个内核调度单元,也就是说都可以作为一条单独的执行路径。但是多进程程序通常有一些限...
    loopppp阅读 482评论 0 0
  • 摘要 线程概念,线程与进程的区别与联系学会线程控制,线程创建,线程终止,线程等待了解线程分离与线程安全学会线程同步...
    狼之足迹阅读 482评论 2 3
  • 线程基础 线程是进程的一个执行单元,执行一段程序片段,线程共享全局变量;线程的查看可以使用命令或者文件来进行查看;...
    秋风弄影阅读 766评论 0 0
  • 简介 线程创建 线程属性设置 线程参数传递 线程优先级 线程的数据处理 线程的分离状态 互斥锁 信号量 一 线程创...
    第八区阅读 8,598评论 1 6
  • iOS 多线程系列 -- 基础概述iOS 多线程系列 -- pthreadiOS 多线程系列 -- NSThrea...
    shannoon阅读 2,708评论 1 8