#include<pthread.h>
由于linux下不默认包含pthread库,所以gcc 要多加一个选项编译 -lpthread
pthread_t tid;//声明线程id变量,unsigned long类型
创建线程函数 int prthead_create(pthread_t *restrict tidp,// tid
const pthread_atter_t *restrict attr,//线程属性结构体指针,通常为NULL
void *(*start_rtn)(void *),//线程执行函数指针,形参和返回值为通用类型指针的函数的指针,如果函数声明是不是函数指针要取地址
// void* start_rtn(void* arg){return ((void*)0);}
void *restrict arg// 一个通用指针,通常为一个结构体,用来传参到执行函数,通常为NULL
) //正确返回0,错误返回errno值
线程退出
任意线程调用exit _Exit _exit会直接终止进程,自然终止线程.
主动退出函数(被动有pthraed_cancel,kill,后面有)
void pthread_exit(void *rual_ptr);//因为线程执行函数要求返回一个通用指针类型,可以强制转换,这个函数相当于return或者exit(值);
pthread_exit((void *)2);
pthread_exit((void *)&str);//str是一个结构体变量
当然可以用 return 返回
等待线程返回(等待pthread_exit返回)
在另一个线程中使用
int pthread_join(pthread_t tid,void **rual_ptr);
成功返回0,错误返回errno值
这个函数会使调用线程阻塞,直到得到等待的线程返回或被取消
如果是join分离状态线程会直接返回错误而不阻塞
这里的rual_ptr是一个通用类型指针的指针,可以得到被终止线程的返回状态PTHREAD_CANCELED(需要先分配一个空间),不需要返回状态可以直接为NULL
PTHREAD_CANCELED
的实际值为-1 //#define PTHREAD_CANCELED ((void *) -1) 头文件中的定义
被动退出线程
int pthread_cancel(pthread_t tid)//成功返回0,否则返回errno值
非阻塞函数,只是发出一个请求,当线程达到中断点时可以退出,由于线程本身可以加入处理之类请求的函数,所以请求不一定能成功
清理函数
看名字都知道是以栈的形式在执行
void pthread_cleanip_push(void (*rtn)(void *),//一个形参和返回值为通用类型指针的函数指针,用来安排调用清理函数顺序
void *arg);//传给清理函数的参数
void pthread_cleanup_pop(int excute);//excute为0则不调用释放,否则释放push和pop函数之间的资源
两个函数必须配对使用,不一定要紧挨
分离状态线程
有些线程可以使自己成为分离状态而单独执行,只是为了不能被join,也就是说分离状态线程只是为了不能被其他线程影响而存在
主动使线程成为分离状态线程函数
int pthread_detach(pthread_t tid);//成功返回0,错误返回errno值
线程同步
因为线程是并行运行,所以在操作同一个文件时不一定会得到预期的结果,所以要同步
同步的解决方式 :加锁 所以发明了一个叫 互斥量 的东西
互斥量只有两种状态:上锁,未上锁
pthread_mutex_t f_lock;//定义一个互斥量变量
初始化一个互斥量
int pthread_mutex_init(&f_lock,
const pthread_mutexattr_t *restrict attr)//互斥量的状态量,后面有,通常为NULL表示默认值
int pthread_mutex_destroy(&f_lock);//删除一个互斥量
int pthread_mutex_lock(&f_lock)//上锁
会阻塞直到上锁成功
int pthread_mutex_trylock(&f_lock)//尝试上锁
不阻塞
int pthread_mutex_unlock(&f_lock)//解锁
对一个互斥量产生两次上锁会阻塞至死
在一个结构体中加入一个互斥量,在操作的时候检测互斥量来实现同步.
如果不检测直接操作其他值也可以,只是互斥量没有起到作用
读写锁
pthread_rwlock_t rw_lock;
基本和互斥量函数一样,一一对应
int pthread_rwlock_init(&rw_lock,
const pthread_rwlockattr_t *restrict attr )//锁的属性,NULL为默认值
int pthread_rwlock_rdlock(&rw_lock);//read锁
阻塞
int pthread_rwlock_wrlock(&rw_lock);//write锁
阻塞
int
pthread_rwlock_undlock(&rw_lock);//解锁,对两种方式都可以解
非阻塞
int pthread_rwlock_trylock(&rw_lock);
非阻塞
int
pthread_wrlock_trylock(&rw_lock);
非阻塞
条件变量
pthread_cond_t con_t=PTHREAD_COND_INITALIZER;//直接定义
pthread_cond_t con_t2;
int pthread_cond_init(&con_t2,
pthread_condattr_t *restrict attr);//条件的状态量结构体指针
int pthread_cond_destory(&con_t2);
未完,后面四个函数还没有理解清楚,暂时总结这么多,下次继续