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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值