在线程实际运行过程当中,咱们常常须要多个线程保持同步。这时能够用互斥锁来完成任务; 互斥锁的使用过程当中,主要有 pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock 这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操做。函数
一,锁的建立测试
锁能够被动态或静态建立,能够用宏PTHREAD_MUTEX_INITIALIZER来静态的初始化锁,采用这种方式比较容易理解,互斥锁是pthread_mutex_t的结构体,而这个宏是一个结构常量,以下能够完成静态的初始化锁:spa
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;线程
另外锁能够用pthread_mutex_init函数动态的建立,函数原型以下:队列
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr)进程
二,锁的属性资源
互斥锁属性能够由pthread_mutexattr_init(pthread_mutexattr_t *mattr);来初始化,而后能够调用其余的属性设置方法来设置其属性;get
互斥锁的范围:能够指定是该进程与其余进程的同步仍是同一进程内不一样的线程之间的同步。能够设置为PTHREAD_PROCESS_SHARE和 PTHREAD_PROCESS_PRIVATE。默认是后者,表示进程内使用锁。可使用int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared)原型
pthread_mutexattr_getshared(pthread_mutexattr_t *mattr,int *pshared)同步
用来设置与获取锁的范围;
互斥锁的类型:有如下几个取值空间:
PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁之后,其他请求锁的线程将造成一个等待队列,并在解锁后按优先级得到锁。这种锁策略保证了资源分配的公平性。
PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,容许同一个线程对同一个锁成功得到屡次,并经过屡次unlock解锁。若是是不一样线程请求,则在加锁线程解锁时从新竞争。
PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,若是同一个线程请求同一个锁,则返回EDEADLK,不然与PTHREAD_MUTEX_TIMED_NP类型动做相同。这样就保证当不容许屡次加锁时不会出现最简单状况下的死锁。
PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动做最简单的锁类型,仅等待解锁后从新竞争。
能够用
pthread_mutexattr_settype(pthread_mutexattr_t *attr , int type)
pthread_mutexattr_gettype(pthread_mutexattr_t *attr , int *type)
获取或设置锁的类型。
三,锁的释放
调用pthread_mutex_destory以后,能够释放锁占用的资源,但这有一个前提上锁当前是没有被锁的状态。
四,锁操做
对锁的操做主要包括加锁 pthread_mutex_lock()、解锁pthread_mutex_unlock()和测试加锁 pthread_mutex_trylock()三个。
int pthread_mutex_lock(pthread_mutex_t *mutex)
int pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t *mutex)
pthread_mutex_trylock()语义与pthread_mutex_lock()相似,不一样的是在锁已经被占据时返回EBUSY而不是挂起等待
五,锁的使用
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex ; void *print_msg(void *arg){ int i=0; pthread_mutex_lock(&mutex); for(i=0;i<15;i++){ printf("output : %d\n",i); usleep(100); } pthread_mutex_unlock(&mutex); } int main(int argc,char** argv){ pthread_t id1; pthread_t id2; pthread_mutex_init(&mutex,NULL); pthread_create(&id1,NULL,print_msg,NULL); pthread_create(&id2,NULL,print_msg,NULL); pthread_join(id1,NULL); pthread_join(id2,NULL); pthread_mutex_destroy(&mutex); return 1; }