пользовательская реализация RAII C ++ для блокированных мьютекс-замков - PullRequest
12 голосов
/ 02 ноября 2011

Я не могу использовать boost или новейшую библиотеку std :: thread.Для этого нужно создать собственную реализацию мьютекса с заданной областью действия.

В нескольких словах, когда экземпляр класса создает блокировки мьютекса.После уничтожения класса мьютекс разблокируется.

Любая реализация доступна?Я не хочу заново изобретать колесо.

Мне нужно использовать pthreads.

  • получение ресурсов является инициализацией == «RAII»

1 Ответ

14 голосов
/ 02 ноября 2011

Примечание Это старый ответ. 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;
};
...