用于范围互斥锁的自定义RAII C ++实现

时间:2011-11-02 07:59:33

标签: c++ linux pthreads mutex raii

我不能使用boost或最新的std :: thread库。要做的是创建一个范围互斥的自定义实现。

简而言之,当一个类实例创建一个互斥锁时。在课堂销毁时,互斥锁被解锁。

任何可用的实施?我不想重新发明轮子。

我需要使用pthreads。

  • 资源获取是初始化==“RAII”

1 个答案:

答案 0 :(得分:14)

  

注意这是一个陈旧的答案。 C ++ 11包含更多独立于平台的帮助程序:

           

其他选项如std :: unique_lock,boost :: unique_lock

任何RAII教程都可以。

这是要点:(也在http://ideone.com/kkB86

// stub mutex_t: implement this for your operating system
struct mutex_t 
{ 
    void Acquire() {} 
    void Release() {} 
};

struct LockGuard
{
     LockGuard(mutex_t& mutex) : _ref(mutex) 
     { 
         _ref.Acquire();  // TODO operating system specific
     };

     ~LockGuard() 
     { 
          _ref.Release(); // TODO operating system specific
     }
   private:
     LockGuard(const LockGuard&); // or use c++0x ` = delete`

     mutex_t& _ref;
};

int main()
{
    mutex_t mtx;

    {
        LockGuard lock(mtx);
        // LockGuard copy(lock); // ERROR: constructor private
        // lock = LockGuard(mtx);// ERROR: no default assignment operator
    }

}

当然你可以使它成为mutex_t的通用,你可以阻止子类化。 由于参考字段

,已禁止复制/分配

编辑对于pthreads:

struct mutex_t
{
    public:
        mutex_t(pthread_mutex_t &lock) : m_mutex(lock) {}

        void Acquire() { pthread_mutex_lock(&m_mutex);   }
        void Release() { pthread_mutex_unlock(&m_mutex); }
    private:
        pthread_mutex_t& m_mutex;
};