前一篇讲了用消息队列实现信号量,这里使用条件变量实现信号量。有关条件变量的使用可以参考我的一篇博文。其实现原理和前面的两篇文章说述的有很大的不同。
其原理是通过一个变量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