1>创建线程
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_t 线程id结构 (不一定是一个整数 有可能是地址之类的)只保证在本进程中是唯一的值
pthread_attr_t 线程属性结构
void *(*start_routine) (void *)函数指针类型这个函数返回一个void*指针 有一个void *参数
thread :作为返回值接收 创建的新的进程ID
attr:进程属性 若设置为NULL 则使用默认属性
start_routine:线程的函数起始地址
arg:传递给新创建线程的参数 如果想传递多个参数可以使用使用结构体
返回值 成功返回0 失败返回错误码 错误码可以用strerror函数打印错误码对应的情况
因为perror使用errno所以是一个不可重入函数 所以使用返回值不会导致出错
线程创建并不能保证那个线程先运行:调用进程 还是创建的进程
2>获取线程id
pthread_self()//返回调用线程的线程id
如果创建线程时先运行的是新线程 那么thread指向的空间可能还不是线程id 也就是说与pthread_self返回的值不同
3>线程终止
**从主线程中return 那么所有的线程都会终止(相当于exit 其他的线程return 相当于pthread_exit 主线程pthread_exit 只会导致自己退出 而不影响其他线程)
**调用exit _Exit _exit使整个进程终止那么所有的线程终止
非控制线程的终止
**简单的return 返回的值就是退出码
**调用void pthread_exit(void *retval)
//void *retval:线程退出时传递出的参数,可以是退出值或地址,如是地址时,不能是线程内部申请的局部地址
**被其他线程终止
4>回收线程并获取线程的退出码
int pthread_join(pthread_t thread, void **retval);
pthread_t thread:回收线程的tid
void **retval:接收退出线程传递出的返回值 如果对线程的返回值不感兴趣那么 retval设置成NULL
返回值:成功返回0,失败返回错误码
调用该函数的线程将挂起等待,直到id为thread的线程终止。
thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:
如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返
回值。
如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存
放的是常数PTHREAD_CANCELED。
如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给
pthread_exit的参数。
这个函数还可以将线程设置成分离态(留在下一篇讨论)
5>pthread_cancel
int pthread_cancel(pthread_t thread); //取消另一个线程
线程之间是可以相互取消的;并且可以取消主线程
被取消的线程,退出值,定义在Linux的pthread库中常数PTHREAD_CANCELED。
调用这个函数后线程并不一定终止
同一进程的线程间,pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程
下次系统调用时,才会真正结束线程。或调用pthread_testcancel,让内核去检测是否需要取消当前线程
系统调用会陷入内核那么线程
6>int pthread_equal(pthread_t t1, pthread_t t2); //比较两个线程值是否相等
因为不确定pthread_t的类型所以我们需要这个函数不能直接 ==
7>分离线程
#include <pthread.h>
int pthread_detach(pthread_t tid);
pthread_t tid:分离线程tid
返回值:成功返回0,失败返回错误号。
一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取
它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收
它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用
pthread_join,这样的调用将返回EINVAL。如果已经对一个线程调用了pthread_detach就不
能再调用pthread_join了。