互斥锁以排他方式防止共享数据被并发访问。互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享数据资源与某个特定互斥锁在逻辑上绑定。
(1)在访问该资源前,首先申请该互斥锁,如果该互斥锁处于开锁状态,则申请到该锁对象,并立即占有该锁(使该锁处于锁定状态),以防止其它线程访问该资源;如果该互斥锁处于锁定状态,默认阻塞当前进程。
(2)只有锁定该互斥锁的进程才能释放该互斥锁。其他线程试图释放操作无效。
(1)定义互斥锁(全局变量)
pthread_mutex_t lock;
(2)初始化互斥锁
int pthread_mutex_init(pthread_mutex_t* mutex,pthread_mutexattr_t* attr);
第1个参数mutex是指向要初始化的互斥锁的指针。
第2个参数mutexattr是指向属性对象的指针,该属性对象定义要初始化的互斥锁的属性。如果该指针为NULL,则使用默认的属性。
使用默认属性初始化互斥锁:
pthread_mutex_init(&lock,NULL);
使用自定义属性初始化互斥锁:
pthread_mutexattr_t mattr;
pthread_mutex_init(&lock,&mattr);
(3)销毁互斥锁
int pthread_mutex_destroy(pthread_mutex_t* mutex);
如果一个线程要占用一共享资源,其必须先申请对应的互斥锁。
阻塞方式申请互斥锁:
int pthread_mutex_lock(pthread_mutex_t* mutex);
非阻塞方式申请互斥锁:
int pthread_mutex_trylock(pthread_mutex_t* mutex);
int pthread_mutex_unlock(pthread_mutex_t* mutex);
(1)定义条件变量(全局变量)
pthread_cond_t condition;
(2)初始化条件变量
int pthread_cond_init(pthread_cond_t* cond,pthread_condattr_t* condattr);
第1个参数cond是指向要初始化或损坏的条件变量的指针。
第2个参数condattr是指向属性对象的指针,该属性对象定义要初始化的条件变量的特性,如果该指针为NULL,则使用默认的属性。
默认属性初始化条件变量:
pthread_cond_init(&condition,NULL);
特定属性初始化条件变量:
pthread_condattr_t cattr;
pthread_cond_init(&condition,&cattr);
(3)销毁条件变量
int pthread_cond_destroy(pthread_cond_t* cond);
通知等待条件变量的第一个线程:
int pthread_cond_signal(pthread_cond_t* cond);
通知等待条件变量的所以线程:
int pthread_cond_broadcast(pthread_cond_t* cond);
阻塞等待某个条件变量:
int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);
第1个参数cond是指向要等待的条件变量的指针。
第2个参数mutex是指向与条件变量cond关联的互斥锁的指针。
在指定的时间范围内等待条件变量:
int pthread_cond_timedwait(pthread_cond_t* cond,pthread_mutex_t* mutex,strcut timespec* expiration);
第1个参数cond是指向要等待的条件变量的指针。
第2个参数mutex是指向与条件变量cond关联的互斥锁的指针。
第3个参数abstime是等待过期时的绝对时间,如果在此时间范围内取到该条件变量函数将返回。
// 以上两个函数都包含一个互斥锁,如果某线程因等待条件变量进入等待状态时,将隐含释放其申请的互斥锁,同样,在返回时,隐含申请到该互斥锁对象操作。
《Linux高级程序设计》
《POSIX多线程程序设计》