sharable_lock предназначен для выполнения задач по блокировке слайдеров (таких как блокировка чтения), разблокировке, блокировке с возможностью разделения и блокировке с временным разделением (рекурсивной или нет) для Mutex. Mutex не должен предоставлять все эти функции. Если клиент sharable_lock не использует функциональность, которую не предоставляет Mutex, никакого вреда не наносится. Владение Mutex может быть разделено между sharable_locks и одним upgradable_lock. sharable_lock не поддерживает семантику копирования. Но sharable_lock поддерживает передачу прав собственности от sharable_lock, upgradable_lock и scoped_lock через синтаксис transfer_lock.
sharable_lock
public
construct/copy/destruct
sharable_lock();
Последствия: По умолчанию строится sharable_lock. Postconditions: owns() == ложный и мутекс() == 0.
explicitsharable_lock(mutex_type& m);
Последствия: m.lock_sharable(). Постусловия: owns() == true и mutex() == &m. Примечания: Конструктор возьмет в собственность мутекс. Если другой поток уже владеет mutex с эксклюзивным владением (scoped_lock), этот поток будет блокироваться до тех пор, пока mutex не будет выпущен. Если другой поток владеет мутексом с возможностью обмена или обновления, то блокировки не произойдет. Независимо от того, обрабатывает ли этот конструктор рекурсивную блокировку, зависит от мутекса.
Постусловия: owns() == true, и mutex() == &m. Примечания: Конструктор предположит, что мутекс уже заперт. Не требуется никакого влияния на упомянутый мутекс.
Последствия: m.try_lock_sharable() Пост-условия: mutex() == &m. owns() == возвращаемое значение m.try_lock_sharable(), выполненного внутри конструктора. Примечания: Конструктор будет владеть мутексом, если он сможет сделать это, не дожидаясь. Независимо от того, обрабатывает ли этот конструктор рекурсивную блокировку, зависит от мутекса. Если mutex_type не поддерживает try_lock_sharable, этот конструктор потерпит неудачу во время компиляции, если будет реализован, но в противном случае не будет иметь эффекта.
Последствия: m.timed_lock_sharable(abs_time) Пост-условия: mutex() == &m. owns() == возвратное значение m.timed_lock_sharable(), выполненного внутри конструктора. Примечания: Конструктор будет владеть mutex, если он сможет сделать это в течение указанного времени. Независимо от того, обрабатывает ли этот конструктор рекурсивную блокировку, зависит от мутекса. Если mutex_type не поддерживает timed_lock_sharable, этот конструктор потерпит неудачу во время компиляции, если будет реализован, но в противном случае не будет иметь эффекта.
Постусловия: mutex() == значение upgr.mutex() до постройки. upgr.owns() == ложное после постройки. Примечание: Если upgr sharable_lock владеет mutex, право собственности перемещается на этот sharable_lock без блокировки. Если upgr sharable_lock не владеет мутексом, то и этот sharable_lock не будет. Только перемещенное sharable_lock будет соответствовать этой подписи. Неподвижный sharable_lock можно перемещать с выражением: «boost::move(lock);». Этот конструктор не изменяет состояние мутекса, только потенциально владеющий им.
Последствия: Если upgr.owns() вызывает разблокировку_upgradable_and_lock_sharable() по адресу mutex. Постусловия: mutex() == значение upgr.mutex() было до строительства. upgr.mutex() == 0 owns() == значение upgr.owns() до строительства. upgr.owns() == ложное после строительства. Примечания: Если upgr заблокирован, этот конструктор заблокирует этот sharable_lock при разблокировке upgr. Только перемещенное sharable_lock будет соответствовать этой подписи. Неподвижный обновляемый_lock можно перемещать с выражением: "boost::move(lock);".
Последствия: Если scop.owns() вызывает разблокировку_and_lock_sharable() по адресу mutex. mutex() == значение scop.mutex() до начала строительства. scop.mutex() == 0 owns() == scop.owns() перед конструктором. После строительства scop.owns() == ложный. Примечания: Если скоп заблокирован, этот конструктор передаст исключительную собственность в сельскохозяйственную собственность этого sharable_lock. Только перемещенное scoped_lock соответствует этой подписи. Неподвижный scoped_lock можно перемещать с выражением: "boost::move(lock);".
Эффекты: Если владеет() перед вызовом, то разблокировка_sharable() вызывается на mutex(). * это приводит к состоянию upgr, а upgr устанавливается в состояние, построенное по умолчанию. Примечания: С рекурсивным мутексом возможно, что и этот, и восходящий владеют мутексом до назначения. В этом случае это будет владеть mutex после назначения (и upgr не будет), но количество блокировки mutex будет уменьшено одним.
~sharable_lock();
Влияние: если (владеет()) mp_mutex->unlock_sharable(). Примечания: Поведение деструктора гарантирует, что замок mutex не просочился.
sharable_lock public member functions
voidlock();
Последствия: Если mutex() == 0 или уже заблокирован, бросается блокировка_исключение() исключение. Вызовы lock_sharable() по адресу mutex. Пост-условия: Собственность () == истинно. Примечание: sharable_lock изменяется от состояния невладения mutex к владению mutex, блокируя при необходимости.
booltry_lock();
Последствия: Если mutex() == 0 или уже заблокирован, бросается блокировка_исключение() исключение. Вызовы try_lock_sharable() по адресу mutex. Постусловия: владеет() == значение, возвращаемое от mutex()->try_lock_sharable(). Примечание: sharable_lock изменяется от состояния невладения mutex к владению mutex, но только если блокировка не требуется. Если mutex_type не поддерживает try_lock_sharable(), эта функция не сработает во время компиляции, если она будет реализована.
Последствия: Если mutex() == 0 или уже заблокирован, бросается блокировка_исключение() исключение. Вызовы timed_lock_sharable(abs_time) по адресу mutex. Постусловия: владеет() == значение, возвращаемое от mutex()->timed_lock_sharable(elps_time). Примечание: sharable_lock изменяется от состояния невладения мутексом к владению мутексом, но только в том случае, если он может получить право собственности в течение указанного временного интервала. Если mutex_type не поддерживает timed_lock_sharable(), эта функция не сработает во время компиляции, если она будет реализована, но в противном случае не будет иметь эффекта.
voidunlock();
Последствия: Если mutex() == 0 или не заблокирован, бросается блокировка_исключение() исключение. Вызовы unlock_sharable() по адресу mutex. Собственные () == ложные. Примечание: sharable_lock изменяется от состояния владения mutex к невладению mutex.
boolowns()const;
Возвращает истинный результат, если этот scoped_lock приобрел указанный mutex.
операторunspecified_bool_type()const;
Конверсия в bool. Возврат собственных ().
mutex_typemutex()const;
Возвращает указатель на упомянутый mutex, или 0, если нет mutex для ссылки.
mutex_typerelease();
Возвращает указатель на упомянутый mutex, или 0, если нет mutex для ссылки. Постусловия: mutex() == 0 и owns() == false.
Последствия: состояние своп-состояния с перемещаемым замком. Броски: Ничего.
Статья Class template sharable_lock раздела The Boost C++ Libraries BoostBook Documentation Subset Indexes and Reference может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.