封装pthread库的几个类(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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这三个类后,一些常用的东西就可以写出来了,比如封装一个队列,一个线程池等等,而不必在代码中使用这些非常底层的同步源语,应该鼓励推荐使用高级的并发工具。接下来就是一一封装这些工具。

猜你喜欢

转载自blog.csdn.net/zeqi1991/article/details/82560091