pthread_mutex_t: 互斥锁,多线程中对共享变量的包保护
pthread_cond_t: 线程间同步,一般和pthread_mutex_t一起使用,以防止出现逻辑错误,即如果单独使用条件变量,某些情况下(条件变量前后出现对共享变量的读写)会出现问题
1. pthread_mutex_t
1> 初始化
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)
或
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
2> 互斥锁属性
PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
设置互斥锁属性 pthread_mutexattr_t mta;
int rv = pthread_mutexattr_init(&mta);
pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_ERRORCHECK_NP);
2. pthread_cond_t
1> 初始化
#include <pthread.h> int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *cattr);
或
pthread_cond_t cv = PTHREAD_COND_INITIALIZER;
2> 其他函数
阻塞在条件变量上pthread_cond_wait
解除在条件变量上的阻塞pthread_cond_signal
阻塞直到指定时间pthread_cond_timedwait
释放阻塞的所有线程pthread_cond_broadcast
释放条件变量pthread_cond_destroy
唤醒丢失问题
在线程未获得相应的互斥锁时调用pthread_cond_signal或pthread_cond_broadcast函数可能会引起唤醒丢失问题。
唤醒丢失往往会在下面的情况下发生:
a. 一个线程调用pthread_cond_signal或pthread_cond_broadcast函数;
b. 另一个线程正处在测试条件变量和调用pthread_cond_wait函数之间;
c. 没有线程正在处在阻塞等待的状态下
参考:
http://blog.csdn.net/icechenbing/article/details/7662026
http://blog.sina.com.cn/s/blog_6ffd3b5c0100mc3n.html