互斥锁
#include
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
对互斥量进行加锁,需要调用pthread_mutex_lock.如果互斥量已经上锁,调用线程将阻塞直到互斥量被解锁,解锁调用pthread_mutex_unlock
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
读写锁
#include
int pthread_rwlock_init(pthread _rwlock_t *rwlock,const pthread_rwlockarrt_r attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
条件变量
给多个线程提供了一个会合的场所,条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr *attr)
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *timeout)
int pthread_cond_signal(pthread_cond-t *cond);
int ptread_cond_broadcast(ptread_cond_t *cond);
twelve pthread control
同一进程中的多个线程如何保持数据的私有性,基于进程的系统调用如何与线程进行交互。
#include
int pthread_attr_init(pthread_attr_t *attr);//初始化pthread_attr_t 结构,包含操作系统支持的线程所有属性的默认值。
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_getdatachstate(const pthread_attr_t *attr,int *datachstate);
int pthread_attr_setdatachstate(const pthread_attr_t *attr,ing detachstate);
int pthread_attr_getstack(const pthread_attr_t *attr,void **stackaddr,size_t *stacksize);
int pthread_attr_setstack(const pthread_attr_t *attr,void*stackaddr,size_t *stacksize);
如何希望改变栈的默认大小,又不想自己处理线栈的分配问题,这时使用
int pthread_attr_getstacksize(const pthread_attr_t *attr,size_t *stacksize)
int pthread_attr_setstacksize(pthread_attr_t *atr,size_t stacksize)
int pthread_attr_getguardsize(const pthread_attr_t *attr,size_t *guardsize)
int pthread_attr_setguardsize(pthread_attr_t *attr,size_t guardsize);
同步属性,互斥量,读写锁,条件变量的属性
pthread_mutexattr_t attr 结构
int pthread_mutexattr_init(pthread_mutexattr_t *attr);//用默认的互斥量属性初始化attr结构,注意属性:进程共享属性和类型属性
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
线程私有数据
在使用私有数据前,需要创建与该数据关联的键,整个键用于获取对线程私有数据的访问权。整个键可以被进程中的所有线程使用,但是每个线程把整个键与不同的线程私有数据地址关联。创建新键时,每个线程的数据地址设为NULL。
int pthread_key_create(pthread_key_t *keyp,void(*destructor)(void *))
int pthread_key_delete(pthread_key_t key);
pthread_once_t initflag=PTHREAD_ONCE_INIT;
int pthread_once(pthread_once_t *initflag,void(*initfn)(void));
void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key,const void *value);
线程与信号
信号由所有线程共享,修改某个信号相关的处理行为以后,所有的线程都共享整个处理行为的改变
int pthread_sigmask(int how,const sigset_t set,sigset_t oset);
int sigwait(const sigset_t *set,int *signop);
把信号发送到线程,可以调用pthread_kill
#include
int pthread_kill(pthread_t thread,ing signo)