33 Thread support library [thread]

33.4 Mutual exclusion [thread.mutex]

33.4.4 Locks [thread.lock]

33.4.4.1 Class template lock_­guard [thread.lock.guard]

namespace std {
  template <class Mutex>
  class lock_guard {
  public:
    using mutex_type = Mutex;

    explicit lock_guard(mutex_type& m);
    lock_guard(mutex_type& m, adopt_lock_t);
    ~lock_guard();

    lock_guard(const lock_guard&) = delete;
    lock_guard& operator=(const lock_guard&) = delete;

  private:
    mutex_type& pm; // exposition only
  };

  template<class Mutex> lock_guard(lock_guard<Mutex>) -> lock_guard<Mutex>;
}

Объект типа lock_­guard контролирует владение блокируемым объектом в области. lock_­guard Объект сохраняет право собственности на блокируемый объект на протяжении всего lock_­guard объекта , lifetime. Поведение программы не определено, если блокируемый объект, на который указывает ссылка, pm не существует в течение всего времени существования lock_­guard объекта. Поставляемый Mutex тип должен соответствовать BasicLockable требованиям.

explicit lock_guard(mutex_type& m);

Requires: Если mutex_­type это не рекурсивный мьютекс, вызывающий поток не владеет мьютексом m.

Effects: Как будто мимо m.lock().

Postconditions: &pm == &m

lock_guard(mutex_type& m, adopt_lock_t);

Requires: Вызывающий поток владеет мьютексом m.

Postconditions: &pm == &m

Throws: Ничего такого.

~lock_guard();

Effects: Как будто мимо pm.unlock().