pthread_cond_t和pthread_mutex_t(条件变量和互斥锁)

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

你可能感兴趣的:(pthread_cond_t和pthread_mutex_t(条件变量和互斥锁))