美文网首页
leveldb源码学习--mutexlock

leveldb源码学习--mutexlock

作者: icecity96 | 来源:发表于2017-02-05 18:45 被阅读0次

    源码实现

    其实现分布在三个文件中:port/port_posix.ccport/port_posix.hutil/mutexlock.h
    其中的实现也非常简单,只是对pthread进行了双层封装,这种封装很大程度上简化了操作。

    class Mutex {
     public:
      Mutex();
      ~Mutex();
    
      void Lock();
      void Unlock();
      void AssertHeld() { }
    
     private:
      friend class CondVar;
      pthread_mutex_t mu_;
    
      // No copying
      Mutex(const Mutex&);
      void operator=(const Mutex&);
    };
    
    class CondVar {
     public:
      explicit CondVar(Mutex* mu);
      ~CondVar();
      void Wait();
      void Signal();
      void SignalAll();
     private:
      pthread_cond_t cv_;
      Mutex* mu_;
    };
    static void PthreadCall(const char* label, int result) {
      if (result != 0) {
        fprintf(stderr, "pthread %s: %s\n", label, strerror(result));
        abort();
      }
    }
    
    Mutex::Mutex() { PthreadCall("init mutex", pthread_mutex_init(&mu_, NULL)); }
    
    Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); }
    
    void Mutex::Lock() { PthreadCall("lock", pthread_mutex_lock(&mu_)); }
    
    void Mutex::Unlock() { PthreadCall("unlock", pthread_mutex_unlock(&mu_)); }
    
    CondVar::CondVar(Mutex* mu)
        : mu_(mu) {
        PthreadCall("init cv", pthread_cond_init(&cv_, NULL));
    }
    
    CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); }
    
    void CondVar::Wait() {
      PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_));
    }
    
    void CondVar::Signal() {
      PthreadCall("signal", pthread_cond_signal(&cv_));
    }
    
    void CondVar::SignalAll() {
      PthreadCall("broadcast", pthread_cond_broadcast(&cv_));
    }
    
    
    // Helper class that locks a mutex on construction and unlocks the mutex when
    // the destructor of the MutexLock object is invoked.
    //
    // Typical usage:
    //
    //   void MyClass::MyMethod() {
    //     MutexLock l(&mu_);       // mu_ is an instance variable
    //     ... some complex code, possibly with multiple return paths ...
    //   }
    
    class SCOPED_LOCKABLE MutexLock {
     public:
      explicit MutexLock(port::Mutex *mu) EXCLUSIVE_LOCK_FUNCTION(mu)
          : mu_(mu)  {
        this->mu_->Lock();
      }
      ~MutexLock() UNLOCK_FUNCTION() { this->mu_->Unlock(); }
    
     private:
      port::Mutex *const mu_;
      // No copying allowed
      MutexLock(const MutexLock&);
      void operator=(const MutexLock&);
    };
    

    如果对pthread有不熟悉的函数可以参考
    https://linux.die.net/man/3/pthread_cond_init
    http://www.jianshu.com/p/5024482ae821

    相关文章

      网友评论

          本文标题:leveldb源码学习--mutexlock

          本文链接:https://www.haomeiwen.com/subject/naveittx.html