Spec-Zone.ru › C++

std::recursive_mutex

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

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

recursive_mutex обеспечивает семантику исключительного рекурсивного владения:

  • Вызывающий поток владеет recursive_mutex в течение периода, который начинается после успешного вызова lock или try_lock. В течение этого периода поток может вызывать lock или try_lock дополнительно. Период владения заканчивается, когда поток совершает соответствующее количество вызовов unlock.
  • Пока поток владеет recursive_mutex, все остальные потоки будут заблокированы (при вызове lock) или получат значение возврата false (при вызове try_lock), если попытаются получить владение recursive_mutex.
  • Максимальное количество раз, которое можно заблокировать recursive_mutex, не определено, но после достижения этого количества вызовы lock будут выбрасывать std::system_error, а вызовы try_lock будут возвращать false.

Поведение программы не определено, если recursive_mutex уничтожается, пока им владеет какой-либо поток. Класс recursive_mutex удовлетворяет всем требованиям Mutex и StandardLayoutType.

Типы-члены

Тип-член Определение
native_handle_type (необязательно*) определяется реализацией

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

(конструктор)
создаёт мьютекс
(открытая функция-член)
(деструктор)
уничтожает мьютекс
(открытая функция-член)
operator=
[удалён]
копирующее присваивание недоступно
(открытая функция-член)
Блокировка
lock
блокирует мьютекс; ожидает, если мьютекс недоступен
(открытая функция-член)
try_lock
пытается заблокировать мьютекс; возвращает управление, если мьютекс недоступен
(открытая функция-член)
unlock
снимает блокировку мьютекса
(открытая функция-член)
Нативный дескриптор
native_handle
возвращает нативный объект-дескриптор, определяемый реализацией
(открытая функция-член)

Пример

Один из вариантов использования recursive_mutex — защита общего состояния класса, функции-члены которого могут вызывать друг друга.

#include <iostream>
#include <mutex>
#include <thread>

class X
{
    std::recursive_mutex m;
    std::string shared;
public:
    void fun1()
    {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun1";
        std::cout << "in fun1, shared variable is now " << shared << '\n';
    }
    void fun2()
    {
        std::lock_guard<std::recursive_mutex> lk(m);
        shared = "fun2";
        std::cout << "in fun2, shared variable is now " << shared << '\n';
        fun1(); // recursive lock becomes useful here
        std::cout << "back in fun2, shared variable is " << shared << '\n';
    }
};

int main() 
{
    X x;
    std::thread t1(&X::fun1, &x);
    std::thread t2(&X::fun2, &x);
    t1.join();
    t2.join();
}

Возможный вывод:

in fun1, shared variable is now fun1
in fun2, shared variable is now fun2
in fun1, shared variable is now fun1
back in fun2, shared variable is fun1

См. также

mutex
(C++11)
предоставляет базовые средства взаимного исключения
(класс)

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

Spec-Zone.ru

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