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

cat*_*eof 12 c++ linux mutex pthreads raii

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

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

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

我需要使用pthreads.

  • 资源获取是初始化=="RAII"

seh*_*ehe 16

注意这是一个老答案.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
    }

}
Run Code Online (Sandbox Code Playgroud)

当然你可以使它成为通用的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;
};
Run Code Online (Sandbox Code Playgroud)

  • 我建议_against_将`pthread_mutex_lock`直接放入lockguard中.我更喜欢_one_**正确的**RIAA类,它可以监视许多不同的同步原语.它减少了代码重复,使LockGuard可单元测试,如果你改变了锁实现等,则不需要你重新编译所有内容. (3认同)