Spec-Zone.ru › C++

std::shared_timed_mutex

Определён в заголовочном файле <shared_mutex>
class shared_timed_mutex;
(начиная с C++14)

Класс shared_timed_mutex — это примитив синхронизации, который можно использовать для защиты общих данных от одновременного доступа из нескольких потоков. В отличие от других типов мьютексов, обеспечивающих исключительный доступ, shared_timed_mutex имеет два уровня доступа:

  • исключительный — только один поток может владеть мьютексом.
  • общий — несколько потоков могут одновременно владеть одним и тем же мьютексом.

Общие мьютексы обычно используются в ситуациях, когда несколько потоков чтения могут одновременно обращаться к одному ресурсу без возникновения гонок данных, но запись может выполнять только один поток.

Подобно timed_mutex, shared_timed_mutex позволяет попытаться получить владение shared_timed_mutex с ограничением по времени с помощью функций-членов try_lock_for(), try_lock_until(), try_lock_shared_for(), try_lock_shared_until().

Класс shared_timed_mutex удовлетворяет всем требованиям SharedTimedMutex и StandardLayoutType.

Функции-члены

(constructor)
создаёт мьютекс
(открытая функция-член)
(destructor)
уничтожает мьютекс
(открытая функция-член)
operator=
[deleted]
копирующее присваивание не поддерживается
(открытая функция-член)
Исключительная блокировка
lock
блокирует мьютекс; если мьютекс недоступен, ожидает
(открытая функция-член)
try_lock
пытается заблокировать мьютекс; возвращает управление, если мьютекс недоступен
(открытая функция-член)
try_lock_for
пытается заблокировать мьютекс; возвращает управление, если мьютекс был
недоступен в течение указанного интервала времени
(открытая функция-член)
try_lock_until
пытается заблокировать мьютекс; возвращает управление, если мьютекс оставался
недоступным до наступления указанного момента времени
(открытая функция-член)
unlock
снимает блокировку мьютекса
(открытая функция-член)
Общая блокировка
lock_shared
блокирует мьютекс для общего владения; если мьютекс недоступен, ожидает
(открытая функция-член)
try_lock_shared
пытается заблокировать мьютекс для общего владения; возвращает управление, если мьютекс недоступен
(открытая функция-член)
try_lock_shared_for
пытается заблокировать мьютекс для общего владения; возвращает управление, если мьютекс был
недоступен в течение указанного интервала времени
(открытая функция-член)
try_lock_shared_until
пытается заблокировать мьютекс для общего владения; возвращает управление, если мьютекс оставался
недоступным до наступления указанного момента времени
(открытая функция-член)
unlock_shared
снимает блокировку мьютекса (общее владение)
(открытая функция-член)

Примечания

Макрос проверки поддержки функции Значение Стандарт Функция
__cpp_lib_shared_timed_mutex 201402L (C++14) std::shared_timed_mutex

Пример

Оператор копирующего присваивания для класса, управляющего ресурсами, к которым могут обращаться несколько потоков чтения, но записывать может только один поток.

#include <mutex>
#include <shared_mutex>

class R
{
    mutable std::shared_timed_mutex mut;
    /* data */
public:
    R& operator=(const R& other)
    {
        // requires exclusive ownership to write to *this
        std::unique_lock<std::shared_timed_mutex> lhs(mut, std::defer_lock);
        // requires shared ownership to read from other
        std::shared_lock<std::shared_timed_mutex> rhs(other.mut, std::defer_lock);
        std::lock(lhs, rhs);
        /* assign data */
        return *this;
    }
};

int main()
{
    R r;
}

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/thread/shared_timed_mutex

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API