Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - [204]

Шрифт
Интервал

.

Результат

Конструирует экземпляр >std::lock_guard, который ссылается на указанный мьютекс и принимает владение блокировкой >m, удерживаемой вызывающим потоком.

Исключения

Нет.

Постусловия

>*this владеет блокировкой >m, удерживаемой вызывающим потоком.

>STD::LOCK_GUARD, ДЕСТРУКТОР

Уничтожает экземпляр >std::lock_guard и освобождает соответствующий мьютекс.

Объявление

>~lock_guard();

Результат

Вызывает >m.unlock() для мьютекса >m, заданного при конструировании >*this.

Исключения

Нет.

D.5.6. Шаблон класса >std::unique_lock

Шаблон класса >std::unique_lock предоставляет более общую обертку владения блокировкой, чем >std::lock_guard. Тип блокируемого мьютекса задается параметром шаблона >Mutex и должен удовлетворять требованиям концепции >BasicLockable. Вообще говоря, заданный мьютекс захватывается в конструкторе и освобождается в деструкторе, хотя имеются также дополнительные конструкторы и функции-члены, предлагающие другие возможности. Тем самым мы получаем средство захвата мьютекса в некотором блоке кода, которое гарантирует освобождение мьютекса при выходе из блока вне зависимости от того, как этот выход произведен: по достижении закрывающей скобки, в результате предложения, меняющего поток управления, например >break или >return, или вследствие исключения.

Функции ожидания в классе >std::condition_variable требуют объекта >std::unique_lock, и любая конкретизация шаблона >std::unique_lock может быть использована в качестве параметра типа >Lockable в любом варианте функции >wait из класса >std::condition_variable_any.

Если тип >Mutex удовлетворяет требованиям концепции >Lockable, то им удовлетворяет и тип >std::unique_lock. Если, кроме того, тип >Mutex удовлетворяет требованиям концепции >TimedLockable, то им удовлетворяет и тип >std::unique_lock.

Экземпляры >std::unique_lock удовлетворяют требованиям концепций >MoveConstructible и >MoveAssignable, но не >CopyConstructible и >CopyAssignable.

Определение класса

>template

>class unique_lock {

>public:

> typedef Mutex mutex_type;


> unique_lock() noexcept;

> explicit unique_lock(mutex_type& m);

> unique_lock(mutex_type& m, adopt_lock_t);

> unique_lock(mutex_type& m, defer_lock_t) noexcept;

> unique_lock(mutex_type& m, try_to_lock_t);


> template

> unique_lock(

>  mutex_type& m,

>  std::chrono::time_point const& absolute_time);


> template

> unique_lock(

>  mutex_type& m,

>  std::chrono::duration const& relative_time);


> ~unique_lock();

> unique_lock(unique_lock const&) = delete;

> unique_lock& operator=(unique_lock const&) = delete;


> unique_lock(unique_lock&&);

> unique_lock& operator=(unique_lock&&);


> void swap(unique_lock& other) noexcept;


> void lock();

> bool try_lock();

> template

> bool try_lock_for(

>  std::chrono::duration const& relative_time);

> template

> bool try_lock_until(

>  std::chrono::time_point const& absolute_time);

> void unlock();


> explicit operator bool() const noexcept;

> bool owns_lock() const noexcept;

> Mutex* mutex() const noexcept;

> Mutex* release() noexcept;

>};

>STD::UNIQUE_LOCK, КОНСТРУКТОР ПО УМОЛЧАНИЮ

Конструирует экземпляр >std::unique_lock, с которым не ассоциирован мьютекс.

Объявление

>unique_lock() noexcept;

Результат

Конструирует экземпляр >std::unique_lock, с которым не ассоциирован мьютекс.

Постусловия

>this->mutex() == NULL, >this->owns_lock() == false.

>STD::UNIQUE_LOCK, ЗАХВАТЫВАЮЩИЙ КОНСТРУКТОР

Конструирует экземпляр >std::unique_lock, который захватывает указанный мьютекс.

Объявление

>explicit unique_lock(mutex_type& m);

Результат

Конструирует экземпляр >std::unique_lock, который ссылается на указанный мьютекс. >Вызывает m.lock().

Исключения

Любое исключение, возбуждаемое >m.lock().

Постусловия

>this->owns_lock() == true, >this->mutex() == &m.

>STD::UNIQUE_LOCK, КОНСТРУКТОР, ПЕРЕНИМАЮЩИЙ БЛОКИРОВКУ

Конструирует экземпляр >std::unique_lock, который владеет блокировкой указанного мьютекса.

Объявление

>unique_lock(mutex_type& m, std::adopt_lock_t);

Предусловия

Вызывающий поток должен владеть блокировкой >m.

Результат

Конструирует экземпляр >std::unique_lock, который ссылается на указанный мьютекс и принимает владение блокировкой >m, удерживаемой вызывающим потоком.

Исключения

Нет.

Постусловия

>this->owns_lock() == true, >this->mutex() == &m.

>STD::UNIQUE_LOCK, КОНСТРУКТОР ОТЛОЖЕННОЙ БЛОКИРОВКИ

Конструирует экземпляр >std::unique_lock, который не владеет блокировкой указанного мьютекса.

Объявление

>unique_lock(mutex_type& m, std::defer_lock_t) noexcept;

Результат

Конструирует экземпляр >std::unique_lock, который ссылается на указанный мьютекс.

Исключения

Нет.

Постусловия

>this->owns_lock() == false, >this->mutex() == &m.

>STD::UNIQUE_LOCK, КОНСТРУКТОР ПРОБНОЙ БЛОКИРОВКИ

Конструирует экземпляр >std::unique_lock, ассоциированный с указанным мьютексом, и пытается захватить этот мьютекс.

Объявление

>unique_lock(mutex_type& m, std::try_to_lock_t);

Предусловия

Тип >Mutex, которым конкретизирован шаблон >std::unique_lock, должен удовлетворять требованиям концепции >Lockable.

Результат

Конструирует экземпляр


Еще от автора Энтони Д Уильямс
Викиномика. Как массовое сотрудничество изменяет всё

Это знаменитый бестселлер, который научит вас использовать власть массового сотрудничества и покажет, как применять викиномику в вашем бизнесе. Переведенная более чем на двадцать языков и неоднократно номинированная на звание лучшей бизнес-книги, "Викиномика" стала обязательным чтением для деловых людей во всем мире. Она разъясняет, как массовое сотрудничество происходит не только на сайтах Wikipedia и YouTube, но и в традиционных компаниях, использующих технологии для того, чтобы вдохнуть новую жизнь в свои предприятия.Дон Тапскотт и Энтони Уильямс раскрывают принципы викиномики и рассказывают потрясающие истории о том, как массы людей (как за деньги, так и добровольно) создают новости, изучают геном человека, создают ремиксы любимой музыки, находят лекарства от болезней, редактируют школьные учебники, изобретают новую косметику, пишут программное обеспечение и даже строят мотоциклы.Знания, ресурсы и вычислительные способности миллиардов людей самоорганизуются и превращаются в новую значительную коллективную силу, действующую согласованно и управляемую с помощью блогов, вики, чатов, сетей равноправных партнеров и личные трансляции.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.