pthread.h不是linux默认头文件 编译时应追加参数-lpthread
如 g++ 11-1.cpp -lpthread
pthread_create函数
int pthread_create(pthread_t* tidp, const pthread_att_t * attr ,void* (*func)(void*),void*arg)
创建线程,成功返回0,否则返回错误编号
创建成功则将新线程ID存入tidp,
attr 为新线程的属性,为空则属性默认
func为新线程执行的函数
arg为func函数参数
pthread_t pthread_self(void)
返回线程自身的线程ID
pthread_cleanup_push与pthread_cleanup_pop函数
void pthread_cleanup_push ( void (*rtn)(void*), void* arg )
void pthread_cleanup_pop( int execute )
两个函数是以宏定义的方式实现的,在push中存在{,在pop中存在与之匹配的},所以两个函数必须成对出现.
两个函数作用为:保证控制流在这个两个函数代码段之间某个点退出时保证push注册的函数以与注册顺序相反的顺序被调用.
当代码执行到pop函数时,取消注册的函数,同时根据pop函数的参数execute确定是否在取消注册函数的同时执行函数(非0值则执行)
pthread_exit函数
void pthread_exit( void *rval_ptr )
推出线程,其它线程通过pthread_join函数访问此函数设置的rval_ptr内容
pthread_join函数
int pthread_join( pthread_tthread, void **rval_ptr )
等待线程thread退出,返回码存于ravl_ptr
三种线程同步的机制
1.互斥量mutex
int pthread_mutex_init( pthread_mutex_t * mutex, const pthread_mutexattr_t* attr )
初始化互斥变量 mutex,如果mutex为静态变量可以用PTHREAD_MUTEX_INITIALIZER初始化
成功则返回0,否则返回错误编号
int pthread_mutex_destroy( pthread_mutex_t* mutex )
销毁动态申请的互斥变量
成功则返回0,否则返回错误编号
int pthread_mutex_lock(pthread_mutex_t* mutex)
以阻塞方式为互斥量mutex加锁,加锁不成功时将阻塞
int pthread_mutex_trylock(pthread_mutex_t* mutex)
以非阻塞方式为互斥量mutex加锁,加锁不成功将返回EBUSY
int pthread_mutex_unlock(pthread_mutex_t* mutex)
为互斥量mutex解锁
成功均返回0,不成功则返回错误编号
2.读写锁
共享读锁,独占写锁
试图加一个写锁时将阻塞后面的读锁请求
int pthread_rwlock_init(pthread_rwlock_t * rwlock, const pthread_rwlockattr_t* attr )
int pthread_rwlock_destroy( pthread_rwlock_t* rwlock )
int pthread_rwlock_rdlock(pthread_rwlock_t* rwlock)
加读锁,加锁不成功时将阻塞
int pthread_rwlock_wrlock(pthread_rwlock_t* rwlock)
加写锁
int pthread_rwlock_unlock(pthread_rwlock_t* rwlock)
解锁
成功均返回0,不成功则返回错误编号
3.条件变量
条件变量与互斥量一起使用,使线程以无竞争的方式等待特定条件发生
int pthread_cond_init( pthread_cond_t * cond, const pthread_condattr_t* attr )
int pthread_cond_destroy(pthread_cond_t* cond )
int pthread_cond_wait(pthread_cond_t* cond ,pthread_mutex_t* mutex)
int pthread_cond_timewait
(pthread_cond_t* cond ,pthread_mutex_t* mutex, const struct timespec* timeout )
使用以下函数唤醒等待某个条件的线程
int pthread_cond_signal(pthread_cond_t* cond)//唤醒等待条件的某个线程
int pthread_cond_broadcast(pthread_cond_t *cond )//唤醒所有等待该条件的线程