版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zeqi1991/article/details/82560091
关于pthread库的条件变量的一个封装
condition.h
#ifndef __INCLUDE_CONDITION_H__
#define __INCLUDE_CONDITION_H__
#include "noncopyable.h"
#include <pthread.h>
#include <sys/types.h>
class MutexLock;
class Condition : public noncopyable
{
public:
Condition(MutexLock& mutex);
~Condition();
//一般条件变量用的函数也就这几个
void Wait();
bool WaitForSeconds(double seconds);
void Notify();
void NotifyAll();
private:
MutexLock& mutex_;
pthread_cond_t pcond_;
};
#endif //__INCLUDE_CONDITION_H__
condition.cpp
#include "condition.h"
#include "mutex_lock.h"
#include <time.h>
#include <errno.h>
Condition::Condition(MutexLock& mutex) : mutex_(mutex)
{
pthread_cond_init(&pcond_, NULL);
}
Condition::~Condition()
{
pthread_cond_destroy(&pcond_);
}
void Condition::Wait()
{
MutexLock::UnassignGuard ug(mutex_);
pthread_cond_wait(&pcond_, mutex_.GetMutexInstance());
}
bool Condition::WaitForSeconds(double seconds)
{
struct timespec abstime;
clock_gettime(CLOCK_REALTIME, &abstime);
const int64_t kNanoSecondsPerSecond = 1000000000;
int64_t nanoseconds = static_cast<int64_t>(seconds * kNanoSecondsPerSecond);
abstime.tv_sec += static_cast<time_t>((abstime.tv_nsec + nanoseconds) / kNanoSecondsPerSecond);
abstime.tv_nsec = static_cast<long>((abstime.tv_nsec + nanoseconds) % kNanoSecondsPerSecond);
MutexLock::UnassignGuard ug(mutex_);
//ETIMEDOUT来自于errno.h
return ETIMEDOUT == pthread_cond_timedwait(&pcond_, mutex_.GetMutexInstance(), &abstime);
}
void Condition::Notify()
{
pthread_cond_signal(&pcond_);
}
void Condition::NotifyAll()
{
pthread_cond_broadcast(&pcond_);
}
封装了MutexLock,MutexLockGuard,Condition这三个类后,一些常用的东西就可以写出来了,比如封装一个队列,一个线程池等等,而不必在代码中使用这些非常底层的同步源语,应该鼓励推荐使用高级的并发工具。接下来就是一一封装这些工具。