Namespaces
Variants

std:: recursive_mutex

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
(C++11)
recursive_mutex
(C++11)
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
Определено в заголовке <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=
[deleted]
не копируемый
(публичная функция-член)
Блокировка
блокирует мьютекс, ожидает если мьютекс недоступен
(публичная функция-член)
пытается заблокировать мьютекс, возвращает управление если мьютекс недоступен
(публичная функция-член)
разблокирует мьютекс
(публичная функция-член)
Нативный дескриптор
возвращает базовый объект нативного дескриптора, определяемый реализацией
(публичная функция-член)

Пример

Одним из случаев применения 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

Смотрите также

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