互斥锁
- 创建
//互斥锁是静态分配的(不是动态申请的)
static pthread_mutex_t mutex_lock = PETHREAD_MUTEX_INITIALIZER;
- 加/解锁
#include <prhread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex_lock);
int pthread_mutex_trylock(pthread_mutex_t *mutex_lock);
//如果互斥锁被锁住,返回 EBUSY
int pthread_mutex_unlock(pthread_mutex_t *mutex_lock);
//success:return 0; or return !0
- 互斥锁属性
#include <prhread.h>
//创建属性
int pthread_mutexattr_init(pthread_mutexattr_t *mutex_attr);
int pthread_mutexattr_destroy(pthread_mutexattr_t *mutex_attr);
//以自定义互斥锁属性初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *mutex_lock, const pthread_mutexattr_t *mutex_attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex_lock);
条件变量
互斥锁是用来上锁的,条件变量是用来等待和通知的
- 创建
//条件变量是静态分配的(不是动态申请的)
static pthread_cond_t cond_lock = PETHREAD_COND_INITIALIZER;
- 等待与通知
int pthread_cond_wait(pthread_cond_t *cond_lock, thread_mutex_t *mutex_lock);
//释放互斥锁 mutex_lock,进入等待状态,等待cond_lock上的通知信号
int pthread_cond_signal(pthread_cond_t *cond_lock);
//通知cond_lock 上等待的其中一个线程
- 属性
//创建属性
int pthread_condattr_init(pthread_condattr_t *cond_attr);
int pthread_condattr_destroy(pthread_condattr_t *cond_attr);
//以自定义条件变量属性初始化互斥锁
int pthread_cond_init(pthread_cond_t *cond_lock, const pthread_condattr_t *cond_attr);
int pthread_cond_destroy(pthread_cond_t *cond_lock);
使用方法
- 当持有互斥锁后,发现后面代码运行条件不满足时,进入等待
//假设:X != 0时,后面代码可运行
if(0 == pthread_mutex_lock(pthread_mutex_t *mutex_lock))
ERROR;
while(X == 0)
pthread_cond_wait(pthread_cond_t *cond_lock, thread_mutex_t *mutex_lock);
- 如果发现X = 0, 则说明有线程可能进入等待,当X ++后,唤醒线程
int sign = 0;
if(0 == pthread_mutex_lock(pthread_mutex_t *mutex_lock))
ERROR;
if(X == 0)
sign = 1;
X++;
if(0 == pthread_unmutex_lock(pthread_mutex_t *mutex_lock))
ERROR;
if(sign)
pthread_cond_signal(pthread_cond_t *cond_lock);