线程同步-条件变量-unix网络编程

 

1.条件变量的概念 

        条件变量是一种机制,它允许线程等待某些事件的发生。几个线程可以等待同一个条件变量直到其他线程激活该条件变量为止,这类似于发送一个通知。这时,可以是一个线程被唤醒以响应这个事件,也可以是所有等待条件变量的线程。
        注意,条件变量本身并不提供“锁”,因此互斥锁常伴随条件变量的使用,提供相应的锁以安全地访问条件变量。

2.条件变量的初始化和撤销
       在使用条件变量前,必须对其进行初始化。初始化条件变量可采用静态或动态初始化方法。
       对于静态初始化方法,需要声明一个 pthread_cond_t  变量,并把它赋值为常数PTHREAD_COND_INITIALIZER:
pthread_cond_t condition = PTHREAD_COND_INITIALIZER; 
       对于动态创建的条件变量,应当使用pthread_cond_init ()函数,其函数原型如下:
#include <pthread.h>
int pthread_cond_init(pthread_cond_t *cond, 
const pthread_condattr_t *attr);
cond:指向一个条件变量。
attr:一个可选的pthread_condattr_t 指针。这个结构可用来设置各种条件变量属性。但是通常并不需要这些属性,所以通常做法是把它指定为  NULL。
返回值:成功时都返回0,否则返回错误码。
一旦使用 pthread_cond_init  ()函数初始化了条件变量,当不用它时,就应使用pthread_cond_destroy ()撤销它。pthread_cond_destroy ()函数的原型如下:
#include <pthread.h>
int pthread_cond_destroy(pthread_cond_t *cond);

cond:指向一个将被撤销的条件变量。
返回值:成功时都返回0,否则返回错误码。
pthread_cond_destroy ()函数释放创建条件变量时分配给它的任何资源,但不会释放用来存储pthread_cond_t的内存。另外,如果还有线程等待该条件变量,不要撤销它,否则会返回错误码EBUSY。 如果有多个线程等待同一个条件变量,唤醒线程的次序由系统的调度策略决定。同时,被唤醒的线程将拥有其调用pthread_cond_wait()或pthread_cond_timedwait()函数时所使用的
互斥锁。如果多个线程被唤醒,谁拥有互斥锁由系统的调度策略决定。

3.发送信号和广播
       如果线程更改某些共享数据后,要唤醒所有正在等待的线程,则应调用
pthread_cond_broadcast()函数。该函数原型如下:
#include <pthread.h>
int pthread_cond_broadcast(pthread_cond_t *cond);
cond:指向一个将被激活的条件变量。
返回值:成功时都返回0,否则返回错误码。
在某些情况下,活动线程只需要唤醒一个正在睡眠的线程。假设只对队列添加了一个工作作业,那么只需要唤醒其中一个线程。pthread_cond_signal()函数就只唤醒一个线程。
其函数原型如下:
#include <pthread.h>
int pthread_cond_signal(pthread_cond_t *cond);
cond:指向一个将被激活的条件变量。
返回值:成功时都返回0,否则返回错误码。
pthread_cond_signal()和pthread_cond_broadcast()函数可以由任一个线程调用,而不管其是否拥有相应的互斥锁。

注意:条件变量应是已被初始化的,否则调用 pthread_cond_signal()或 pthread  _cond _broadcast()函数会返回错误码EINAL。
4.等待条件变量
        一旦初始化了互斥锁和条件变量,就可以等待某个条件。pthread_cond_wait()和pthread_cond_timedwait()函数实现等待条件变量的功能。它们对拥有的互斥锁进行解锁,然后挂起线程直至该条件变量被激活。当线程被唤醒后,它们对互斥锁进行加锁并返回。
pthread_cond_wait()函数原型如下:
#include <pthread.h>
int pthread_cond_wait(pthread_cond_t *cond,  pthread_mutex_t  *mutex);
cond:指向条件变量。
mutex:指向互斥锁。
返回值:成功时返回0,否则返回错误码。 
        与 pthread_cond_wait()函数不同,pthread_cont_timedwait()函数指定一个等待的时间,如果超时,即使等待的条件变量还未被激活,它也将返回。其函数原形如下:

#include <pthread.h>
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
const struct timespec *abstime);
cond:指向条件变量。
mutex:指向互斥锁。
abstime:指向一个绝对时间。

注意:一个互斥锁可以用于许多条件变量,但每个条件变量只能有一个互斥锁。调用pthread_cond_wait( )和pthread_cond_timedwait( )函数之前应把互斥锁锁定。

我觉得还是最好,一个条件变量对应一把锁吧。。。这样一一对应吧

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值