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

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

, и счетчик захватов >*this текущим потоком увеличивается на единицу. Если текущий поток не удерживал >*this, то функция может не захватить мьютекс (и вернуть >false), даже если никакой другой поток не удерживает >*this.

>STD::RECURSIVE_TIMED_MUTEX::TRY_LOCK_FOR, ФУНКЦИЯ-ЧЛЕН

Пытается захватить объект >std::recursive_timed_mutex для текущего потока.

Объявление

>template

>bool try_lock_for(

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

Результат

Пытается захватить объект >std::recursive_timed_mutex для текущего потока в течение времени, заданного аргументом >relative_time. Если >relative_time.count() равно нулю или отрицательно, то функция возвращается немедленно, как если бы это был вызов >try_lock(). В противном случае вызывающий поток приостанавливается до получения мьютекса или до истечения времени, заданного аргументом >relative_time.

Возвращаемое значение

>true, если вызывающий поток захватил мьютекс, иначе >false.

Постусловия

>*this захвачен вызывающим потоком, если функция вернула >true.

Исключения

Нет.

Примечание. Если вызывающий поток уже удерживал >*this, то функция возвращает >true, и счетчик захватов >*this текущим потоком увеличивается на единицу. Если текущий поток не удерживал >*this, то функция может не захватить мьютекс (и вернуть >false), даже если никакой другой поток не удерживает >*this. Поток может быть блокирован дольше, чем указано. Если возможно, истекшее время измеряется по стабильным часам.

>STD::RECURSIVE_TIMED_MUTEX::TRY_LOCK_UNTIL, ФУНКЦИЯ-ЧЛЕН

Пытается захватить объект >std::recursive_timed_mutex для текущего потока.

Объявление

>template

>bool try_lock_until(

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

Результат

Пытается захватить объект >std::recursive_timed_mutex для текущего потока, пока не наступит момент времени, заданный аргументом >absolute_time. Если в момент вызова >absolute_time <= Clock::now(), то функция возвращается немедленно, как если бы это был вызов >try_lock(). В противном случае вызывающий поток приостанавливается до получения мьютекса или до наступления момента времени, большего или равного >absolute_time.

Возвращаемое значение

>true, если вызывающий поток захватил мьютекс, иначе >false.

Постусловия

>*this захвачен вызывающим потоком, если функция вернула >true.

Исключения

Нет.

Примечание. Если вызывающий поток уже удерживал >*this, то функция возвращает >true, и счетчик захватов >*this текущим потоком увеличивается на единицу. Если текущий поток не удерживал >*this, то функция может не захватить мьютекс (и вернуть >false), даже если никакой другой поток не удерживает >*this. Не дается никаких гарантий относительно того, сколько времени будет блокирован вызывающий поток. Гарантируется лишь, что если функция вернула >false, то значение, возвращенное >Clock::now(), больше или равно >absolute_time в точке, где поток разблокировался.

>STD::RECURSIVE_TIMED_MUTEX::UNLOCK, ФУНКЦИЯ-ЧЛЕН

Освобождает объект >std::recursive_timed_mutex, удерживаемый текущим потоком.

Объявление

>void unlock();

Предусловия

Вызывающий поток должен удерживать мьютекс >*this.

Результат

Освобождает мьютекс >*this, удерживаемый текущим потоком. Если это последний захват >*this данным потоком, и другие потоки были блокированы в ожидании >*this, то один из них разблокируется.

Постусловия

Количество захватов >*this вызывающим потоком, уменьшается на единицу.

Исключения

Нет.

D.5.5. Шаблон класса >std::lock_guard

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

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

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

>template

>class lock_guard {

>public:

> typedef Mutex mutex_type;


> explicit lock_guard(mutex_type& m);

> lock_guard(mutex_type& m, adopt_lock_t);

> ~lock_guard();


> lock_guard(lock_guard const&) = delete;

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

>};

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

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

Объявление

>explicit lock_guard(mutex_type& m);

Результат

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

Исключения

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

Постусловия

>*this владеет блокировкой >m.

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

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

Объявление

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

Предусловия

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


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

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


Рекомендуем почитать
Как хорошему разработчику не стать плохим менеджером

В этой книге автор, сам прошедший путь от разработчика до менеджера в сфере IT, рассказывает неочевидные моменты, которые являются критически важными для правильного управления. Почему разработчики увольняются после повышения зарплаты? Как делать FixedPrice проекты? Почему Scrum не упрощает менеджмент? Книга содержит ответ на эти и многие другие вопросы. В книге есть много баек, которые показывают тяжёлую, но интересную жизнь менеджера в разработке. Иллюстратор обложки: Ксения Ерощенко. Иллюстрации в тексте книги авторские.


Геймдизайн. Рецепты успеха лучших компьютерных игр от Super Mario и Doom до Assassin’s Creed и дальше

Что такое ГЕЙМДИЗАЙН? Это не код, графика или звук. Это не создание персонажей или раскрашивание игрового поля. Геймдизайн – это симулятор мечты, набор правил, благодаря которым игра оживает. Как создать игру, которую полюбят, от которой не смогут оторваться? Знаменитый геймдизайнер Тайнан Сильвестр на примере кейсов из самых популярных игр рассказывает как объединить эмоции и впечатления, игровую механику и мотивацию игроков. Познакомитесь с принципами дизайна, которыми пользуются ведущие студии мира! Создайте игровую механику, вызывающую эмоции и обеспечивающую разнообразие.


Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.



MySQL 5.0. Библиотека программиста

Эта книга предназначена для всех, кто желает освоить СУБД MySQL. Для ее чтения вам не нужны никакие специальные знания – достаточно быть пользователем Windows. Вы узнаете, как установить и запустить MySQL, как создать собственную базу данных, как работать с данными при помощи команд SQL, как администрировать базу данных и оптимизировать ее работу. Разработчики веб-приложений на языках PHP, Perl и Java найдут в этой книге полезные сведения по использованию базы данных MySQL в соответствующих приложениях.


Программирование на Visual C++. Архив рассылки

РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ ПРОЕКТА RSDN, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.