std:: recursive_mutex
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Locking | ||||
| Native handle | ||||
|
Определено в заголовке
<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)
|
предоставляет базовое средство взаимного исключения
(класс) |