33 Thread support library [thread]

33.4 Mutual exclusion [thread.mutex]

33.4.3 Mutex requirements [thread.mutex.requirements]

33.4.3.5 Shared timed mutex types [thread.sharedtimedmutex.requirements]

Стандартный тип библиотеки shared_­timed_­mutex - это shared timed mutex type. Общие синхронизированных типы взаимных блокировок должны отвечать требованиям timed mutex types, shared mutex typesи , кроме того , должны отвечать требованиям , изложенным ниже. В этом описании m обозначает объект общего типа синхронизированного мьютекса, rel_­type обозначает объект создания экземпляра durationи abs_­time обозначает объект создания экземпляра time_­point.

Выражение m.try_­lock_­shared_­for(rel_­time) должно быть правильно сформированным и иметь следующую семантику:

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

Effects: Пытается получить право владения разделяемой блокировкой для вызывающего потока в течение относительного времени ожидания ([thread.req.timing]), указанного в rel_­time. Если время, указанное в, rel_­time меньше или равно rel_­time.zero(), функция пытается получить право владения без блокировки (как если бы путем вызова try_­lock_­shared()). Функция должна вернуться в течение тайм-аута, указанного в, rel_­time только если она получила совместное владение объектом мьютекса. [ Note: Как и в случае try_­lock(), нет никакой гарантии, что право собственности будет получено, если блокировка доступна, но ожидается, что реализации приложат для этого серьезные усилия. ] Если выбрасывается исключение, то для текущего потока не должна быть получена разделяемая блокировка. end note

Return type: bool.

Returns: true если была получена разделяемая блокировка, false иначе.

Synchronization: Если try_­lock_­shared_­for() возвращается true, предыдущие unlock() операции с тем же объектом синхронизируются с ([intro.multithread]) этой операцией.

Throws: Исключения, связанные с тайм-аутом ([thread.req.timing]).

Выражение m.try_­lock_­shared_­until(abs_­time) должно быть правильно сформированным и иметь следующую семантику:

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

Effects: Функция пытается получить совместное владение мьютексом. Если abs_­time он уже прошел, функция пытается получить совместное владение без блокировки (как если бы путем вызова try_­lock_­shared()). Функция должна возвращаться до истечения абсолютного тайм-аута ([thread.req.timing]), указанного в, abs_­time только если она получила совместное владение объектом мьютекса. [ Note: Как и в случае try_­lock(), нет никакой гарантии, что право собственности будет получено, если блокировка доступна, но ожидается, что реализации приложат для этого серьезные усилия. ] Если выбрасывается исключение, то для текущего потока не должна быть получена разделяемая блокировка. end note

Return type: bool.

Returns: true если была получена разделяемая блокировка, false иначе.

Synchronization: Если try_­lock_­shared_­until() возвращается true, предыдущие unlock() операции с тем же объектом синхронизируются с ([intro.multithread]) этой операцией.

Throws: Исключения, связанные с тайм-аутом ([thread.req.timing]).

33.4.3.5.1 Class shared_­timed_­mutex [thread.sharedtimedmutex.class]

namespace std {
  class shared_timed_mutex {
  public:
    shared_timed_mutex();
    ~shared_timed_mutex();

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

    // Exclusive ownership
    void lock();  // blocking
    bool try_lock();
    template <class Rep, class Period>
      bool try_lock_for(const chrono::duration<Rep, Period>& rel_time);
    template <class Clock, class Duration>
      bool try_lock_until(const chrono::time_point<Clock, Duration>& abs_time);
    void unlock();

    // Shared ownership
    void lock_shared();  // blocking
    bool try_lock_shared();
    template <class Rep, class Period>
      bool
      try_lock_shared_for(const chrono::duration<Rep, Period>& rel_time);
    template <class Clock, class Duration>
      bool
      try_lock_shared_until(const chrono::time_point<Clock, Duration>& abs_time);
    void unlock_shared();
  };
}

Класс shared_­timed_­mutex предоставляет нерекурсивный мьютекс с семантикой совместного владения.

Класс shared_­timed_­mutex должен удовлетворять всем требованиям shared timed mutex requirements. Это должен быть класс стандартной компоновки (пункт [class]).

Поведение программы не определено, если:

  • он уничтожает shared_­timed_­mutex объект, принадлежащий любому потоку,

  • поток пытается рекурсивно получить право собственности на a shared_­timed_­mutex, или

  • поток завершается, когда ему принадлежит какое-либо право собственности на a shared_­timed_­mutex.