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

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

в точке, где поток разблокировался.

Синхронизация

Обращения к функциям >notify_one(), >notify_all(), >wait(), >wait_for() и >wait_until() одного и того же объекта >std::condition_variable сериализуются. Обращение к >notify_one() или >notify_all() будит только потоки, запущенные до этого обращения.

>STD::CONDITION_VARIABLE::WAIT_UNTIL, ПЕРЕГРУЖЕННАЯ ФУНКЦИЯ-ЧЛЕН, ПРИНИМАЮЩАЯ ПРЕДИКАТ

Ожидает, пока условная переменная >std::condition_variable не получит сигнал в результате обращения к >notify_one() или >notify_all(), и при этом предикат равен >true, либо не будет достигнут указанный момент времени.

Объявление

>template

>bool wait_until(

> std::unique_lock& lock,

> std::chrono::time_point const& absolute_time,

> Predicate pred);

Предусловия

Выражение >pred() должно быть допустимо и возвращать значение, преобразуемое в тип >bool. Значение >lock.owns_lock() должно быть равно >true, и владельцем блокировки >lock должен быть поток, вызвавший >wait_until().

Результат

Эквивалентно следующему коду:

>while (!pred()) {

> if (wait_until(lock, absolute_time) == std::cv_status::timeout)

>  return pred();

>}

>return true;

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

>true, если последнее обращение к >pred() вернуло >true; >false, если функция >Clock::now() вернула время, большее или равное >absolute_time, и обращение к >pred() вернуло >false.

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

Исключения

Исключение, возбужденное в результате обращения к >pred, или >std::system_error, если действие не выполнено.

Синхронизация

Обращения к функциям >notify_one(), >notify_all(), >wait(), >wait_for() и >wait_until() одного и того же объекта >std::condition_variable сериализуются. Обращение к >notify_one() или >notify_all() будит только потоки, запущенные до этого обращения.

>STD::NOTIFY_ALL_AT_THREAD_EXIT, ФУНКЦИЯ, НЕ ЯВЛЯЮЩАЯСЯ ЧЛЕНОМ КЛАССА

Пробуждает все потоки, ожидающие >std::condition_variable, при завершении текущего потока.

Объявление

>void notify_all_at_thread_exit(

> condition_variable& cv, unique_lock lk);

Предусловия

Значение >lock.owns_lock() равно >true, и владельцем блокировки >lock является вызывающий поток. Функция >lk.mutex() должна возвращать такое же значение, как для любого объекта блокировки, передаваемого функциям-членам >wait(), >wait_for() или >wait_until() объекта >cv из одновременно ожидающих потоков.

Результат

Передает владение мьютексом, захваченным >lk, внутреннему объекту и планирует отправку уведомления условной переменной >cv при завершении вызывающего потока. Уведомление эквивалентно выполнению следующего кода:

>lk.unlock();

>cv.notify_all();

Исключения

Возбуждает исключение >std::system_error, если действие не выполнено.

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

Пользователь должен следить за тем, чтобы ожидающий поток не сделал ошибочного предположения о том, что в момент его пробуждения данный поток уже завершен, — в частности, из-за возможности ложного пробуждения. Для этого можно проверять в ожидающем потоке предикат, который может быть сделан истинным только уведомляющим потоком, причём это должно делаться под защитой мьютекса, который не освобождается до вызова >notify_all_at_thread_exit.

D.2.2. Класс >std::condition_variable_any

Класс >std::condition_variable_any позволяет потоку ждать выполнения условия. Если объект >std::condition_variable можно использовать только с блокировкой типа >std::unique_lock, то >std::condition_variable_any допустимо использовать с блокировкой любого типа, удовлетворяющего требованиям концепции >Lockable.

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

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

>class condition_variable_any {

>public:

> condition_variable_any();

> ~condition_variable_any();


> condition_variable_any(

>  condition_variable_any const&) = delete;

> condition_variable_any& operator=(

>  condition_variable_any const&) = delete;


> void notify_one() noexcept;

> void notify_all() noexcept;


> template

> void wait(Lockable& lock);


> template

> void wait(Lockable& lock, Predicate pred);


> template

> std::cv_status wait_until(

>  Lockable& lock,

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


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

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


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

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


Программное обеспечение и его разработка

Автор книги — американский специалист по программированию, один из руководителей фирмы IBM, в своей книге делает попытку изложить общие проблемы создания программного обеспечения, его сопровождения и использования. Особенно подробно рассматриваются все фазы разработки программ разных типов. Изложение ясное, удачно иллюстрировано примерами.Для программистов разной квалификации и пользователей ЭВМ.fb2: ВНИМАНИЕ. В тексте присутствуют таблицы. Рекомендуется читать файл с помощью программы, поддерживающей их отображение.


Создание инструмента научных исследований на основе XML: Проблемы и методология

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


Java 7

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


Идиомы и стили С++

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


Тонкости дизассемблирования

Очень часто под рукой не оказывается ни отладчика, ни дизассемблера, ни даже компилятора, чтобы набросать хотя бы примитивный трассировщик. Разумеется, что говорить о взломе современных защитных механизмов в таких условиях просто смешно, но что делать если жизнь заставляет?..