Подтвердить что ты не робот

Пользовательская реализация RAII С++ для заблокированных блокировок мьютексов

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

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

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

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

  • сбор ресурсов - инициализация == "RAII"
4b9b3361

Ответ 1

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