实现信号量(四) 条件变量实现信号量

         前一篇讲了用消息队列实现信号量,这里使用条件变量实现信号量。有关条件变量的使用可以参考我的一篇博文。其实现原理和前面的两篇文章说述的有很大的不同。

        其原理是通过一个变量sig_num来标明信号量的值(即资源的可用个数)。当然这个变量的修改要用一个mutex来锁住。当使用v操作释放一个资源时,在实现函数里面,将调用条件变量的信号发送函数pthread_cond_signal,唤醒线程,并且sig_num自加一标志可用资源多了一个。


        还是上代码吧。

#ifndef COND_SEM_HPP
#define COND_SEM_HPP

#include"cond_sync.hpp"
#include  <errno.h>

typedef Cond_sync_t cond_sem_t;



#define COND_SEM_INITIALIZER(num) COND_SYNC_INITIALIZER_V(num)


inline int cond_sem_init(cond_sem_t* con, int num)
{
    int status = cond_sync_init(con);
    con->sig_num = num;
    return status;
}


inline int cond_sem_p(cond_sem_t* con)
{
    return cond_sync_wait(con);
}


inline int cond_sem_tryP(cond_sem_t* con)
{
    int status = cond_sync_timedwait(con, 0);
    if( status == ETIMEDOUT )
        return EAGAIN;
	
    return status;
}


inline int cond_sem_v(cond_sem_t* con)
{
    return cond_sync_signal(con);
}


inline int cond_sem_destroy(cond_sem_t* con)
{
    return cond_sync_destroy(con);
}


#endif // COND_SEM_HPP

        如代码所示,cond_sem_t是由Cond_sync_t实现的。

        cond_sync.hpp文件

#ifndef COND_SYNC_HPP
#define COND_SYNC_HPP


#include<pthread.h>

typedef struct Cond_sync_tag
{
    pthread_mutex_t mutex;
    pthread_cond_t cond;
    int sig_num; //signal's num
    int valid;
}Cond_sync_t;


#define COND_SYNC_VALID 0xabcd


#define COND_SYNC_INITIALIZER_V(num) \
{ PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER, num, COND_SYNC_VALID}

#define COND_SYNC_INITIALIZER COND_SYNC_INITIALIZER_V(0)

int cond_sync_init(Cond_sync_t* cond_s);
int cond_sync_destroy(Cond_sync_t* cond_s);
int cond_sync_wait(Cond_sync_t* cond_s);
int cond_sync_timedwait(Cond_sync_t* cond_s, int msecs); //Millisecond
int cond_sync_signal(Cond_sync_t* cond_s);

#endif // COND_SYNC_HPP

        cond_sync.cpp文件

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值