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/w/cpp/thread/recursive_mutex

Spec-Zone.ru

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