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

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

для текущего потока.

Объявление

>bool try_lock() noexcept;

Результат

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

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

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

Постусловия

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

Исключения

Нет.

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

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

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

Объявление

>void unlock();

Предусловия

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

Результат

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

Постусловия

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

Исключения

Нет.

D.5.3. Класс >std::timed_mutex

Класс >std::timed_mutex предоставляет поддержку блокировок с таймаутами сверх базовых средств взаимного исключения и синхронизации, предоставляемых классом >std::mutex. Перед тем как обращаться к данным, защищаемым мьютексом, этот мьютекс необходимо захватить (или заблокировать), вызвав функцию l>ock(), >try_lock(), >try_lock_for() или >try_lock_until(). Если мьютекс уже захвачен другим потоком, то функция >try_lock() вернет ошибку, функция >lock() приостановит выполнение потока до получения мьютекса, а функции >try_lock_for() и >try_lock_until() приостановят выполнение потока до получения мьютекса или истечения таймаута. Закончив операции над разделяемыми данными, поток должен вызвать функцию >unlock() (вне зависимости от того, какой функцией мьютекс был захвачен), чтобы освободить мьютекс и дать другим потокам возможность захватить его.

Экземпляр >std::timed_mutex удовлетворяет требованиям концепции >TimedLockable.

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

>class timed_mutex {

>public:

> timed_mutex(timed_mutex const&)=delete;

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

> timed_mutex();

> ~timed_mutex();


> void lock();

> void unlock();

> 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);

>};

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

Конструирует объект >std::timed_mutex.

Объявление

>timed_mutex();

Результат

Конструирует экземпляр >std::timed_mutex.

Постусловия

Вновь сконструированный объект >std::timed_mutex первоначально не захвачен.

Исключения

Исключение типа >std::system_error, если не удалось создать экземпляр >std::timed_mutex.

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

Уничтожает объект >std::timed_mutex.

Объявление

>~timed_mutex();

Предусловия

Объект >*this не должен быть захвачен.

Результат

Уничтожает >*this.

Исключения

Нет.

>STD::TIMED_MUTEX::LOCK, ФУНКЦИЯ-ЧЛЕН

Захватывает объект >std::timed_mutex для текущего потока.

Объявление

>void lock();

Предусловия

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

Результат

Блокирует текущий поток, пока мьютекс >*this не будет захвачен.

Постусловия

>*this захвачен текущим потоком.

Исключения

Исключение типа >std::system_error в случае ошибки.

>STD::TIMED_MUTEX::TRY_LOCK, ФУНКЦИЯ-ЧЛЕН

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

Объявление

>bool try_lock();

Предусловия

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

Результат

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

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

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

Постусловия

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

Исключения

Нет.

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

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

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

Объявление

>template

>bool try_lock_for(

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

Предусловия

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

Результат

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

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

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

Постусловия

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

Исключения

Нет.

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


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

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


Рекомендуем почитать
JavaScript с нуля

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


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

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


QT 4: программирование GUI на С++

Единственное официальное руководстро по практическому программированию в среде Qt 4.1.Применяя средства разработки Qt компании «Trolltech», вы сможете создавать на С++ промышленные приложения, которые естественно работают в средах Windows, Linux/UNIX, Linux для встроенных систем без изменения программного кода и Mac Os X. Книга написана сотрудниками компании «Trolltech». Она представляет собой практическое руководство по успешному применению самой мощной из всех созданных до сих пор версий Qt — Qt 4.1.Из книги «Qt 4: программирование GUI на С++» вы узнаете о наиболее эффективных приемах и методах программирования с применением Qt 4 и овладеете ключевыми технологиями в самых различных областях — от архитектуры Qt модель/представление до мощного графического процессора 2D.


Интернет решения от доктора Боба

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


Как писать драйвера

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


Интерфейс: новые направления в проектировании компьютерных систем

Книга эта непростая и подойдет не каждому. Автор анализирует то, к чему мы все давно привыкли до автоматизма, и объясняет, что интерфейс многих современных программ далек от совершенства. Как его улучшить, в каком направлении двигаться дальше? Попробуйте найти ответы вместе с самым известным специалистом в этой области – Джефом Раскиным, создателя проекта Apple Macintosh.Сейчас много говорят об эффективности современных подходов к разработке интерфейсов. Раскин же демонстрирует, что многие из них ведут в тупик, и для создания компьютеров, с которыми было бы проще работать, требуются совершенно новые принципы разработки.