pthread_mutex_t与pthread_cond_t

这两个都是在<pthread.h>中定义的结构,pthread_mutex_t是互斥锁,pthread_cond_t是条件变量,主要用于PV操作。

pthread_mutex_t:

1. pthread_mutex_t的初始化:初始化可以用int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t * attr),这是动态创建方法,参数mutex传入pthread_mutex_t结构体的地址,参数attr是定义互斥所的属性,一般为NULL。成功初始化返回0,否则返回其他值。至于后面的attr可以有4个取值的属性,现列在下方:

互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。当前(glibc2.2.3,linuxthreads0.9)有四个值可供选择:

* PTHREAD_MUTEX_TIMED_NP,这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。

* PTHREAD_MUTEX_RECURSIVE_NP,嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。

* PTHREAD_MUTEX_ERRORCHECK_NP,检错锁,如果同一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_TIMED_NP类型动作相同。这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。

* PTHREAD_MUTEX_ADAPTIVE_NP,适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。


除了动态初始化,还有静态初始化方法:POSIX定义了一个宏PTHREAD_MUTEX_INITIALIZER来静态初始化互斥锁,方法如下:

pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 前面已经说过,pthread_mutex_t是一个结构体,二PTHREAD_MUTEX_INITIALIZER是一个结构常量。

2.pthread_mutex_t的销毁:

pthread_mutex_destroy ()用于注销一个互斥锁,API定义如下:

int pthread_mutex_destroy(pthread_mutex_t *mutex)。 返回0则销毁成功,否则销毁失败。

3.pthread_mutex_t的加锁和解锁过程:

这里介绍三种:

int pthread_mutex_lock(pthread_mutex_t *mutex)

int pthread_mutex_unlock(pthread_mutex_t *mutex)

int pthread_mutex_trylock(pthread_mutex_t *mutex)

trylock与lock不同的一点在于在锁已经被占据时返回EBUSY而不是挂起等待。

pthread_cond_t:

pthread_cond_t是条件变量,和pthread_mutex_t类似,初始化分为静态和动态的:

#include <pthread.h>
int pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *cattr); 或者是 pthread_cond_t cv = PTHREAD_COND_INITIALIZER; 成功则返回0,否则返回其他值。注意不能由多个线程同时初始化一个条件变量。当需要重新初始化或释放一个条件变量时,应用程序必须保证这个条件变量未被使用。

除此之外还有其他函数,下面会具体讲解:
阻塞在条件变量上pthread_cond_wait
解除在条件变量上的阻塞pthread_cond_signal
阻塞直到指定时间pthread_cond_timedwait
释放阻塞的所有线程pthread_cond_broadcast
释放条件变量pthread_cond_destroy

首先是pthread_cond_wait:它的定义:

#include <pthread.h>

int pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *mutex);

返回值:函数成功返回0;任何其他返回值都表示错误

函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。

被阻塞的线程可以被pthread_cond_signal函数,pthread_cond_broadcast函数唤醒,也可能在被信号中断后被唤醒。

pthread_cond_wait函数的返回并不意味着条件的值一定发生了变化,必须重新检查条件的值。

pthread_cond_wait函数返回时,相应的互斥锁将被当前线程锁定,即使是函数出错返回。









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值