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

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


> template <

>  typename Lockable, typename Clock,

>  typename Duration, typename Predicate>

> bool wait_until(

>  Lockable& lock,

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

>  Predicate pred);


> template

> std::cv_status wait_for(

>  Lockable& lock,

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


> template <

>  typename Lockable, typename Rep,

>  typename Period, typename Predicate>

> bool wait_for(

>  Lockable& lock,

>  const std::chrono::duration& relative_time,

>  Predicate pred);

>};

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

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

Объявление

>condition_variable_any();

Результат

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

Исключения

Исключение типа >std::system_error, если сконструировать условную переменную не получилось.

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

Уничтожает объект s>td::condition_variable_any.

Объявление

>~condition_variable_any();

Предусловия

Не существует потоков, заблокированных по >*this в обращениях к >wait(), >wait_for() или >wait_until().

Результат

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

Исключения

Нет.

>STD::CONDITION_VARIABLE_ANY::NOTIFY_ONE, ФУНКЦИЯ-ЧЛЕН

Пробуждает один из потоков, ожидающих >std::condition_variable_any.

Объявление

>void notify_one() noexcept;

Результат

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

Исключения

Исключение типа >std::system_error, если действие не выполнено.

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

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

>STD::CONDITION_VARIABLE_ANY::NOTIFY_ALL, ФУНКЦИЯ-ЧЛЕН

Пробуждает все потоки, ожидающие >std::condition_variable_any.

Объявление

>void notify_all() noexcept;

Результат

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

Исключения

Исключение типа >std::system_error, если действие не выполнено.

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

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

>STD::CONDITION_VARIABLE::WAIT, ФУНКЦИЯ-ЧЛЕН

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

Объявление

>template

>void wait(Lockable& lock);

Предусловия

Тип >Lockable удовлетворяет требованиям концепции >Lockable и >lock владеет блокировкой.

Результат

Атомарно разблокирует предоставленный объект >lock и блокирует поток, пока он не будет разбужен обращением к >notify_one() или >notify_all() из другого потока либо не произойдёт ложное пробуждение. Перед возвратом управления из >wait() объект >lock снова блокируется.

Исключения

Исключение типа >std::system_error, если действие не выполнено. Если объект >lock был разблокирован при обращении к >wait(), он снова блокируется при выходе из нее, даже если выход произошёл в результате исключения.

Примечание. Ложное пробуждение означает, что поток, вызвавший >wait(), может быть разбужен, даже если ни один другой поток не обращался к >notify_one() или >notify_all(). Поэтому рекомендуется использовать перегруженный вариант >wait(), который принимает предикат. Если это нежелательно, то рекомендуется вызывать >wait() в цикле, где проверяется предикат, ассоциированный с условной переменной.

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

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

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

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

Объявление

>template

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

Предусловия

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

Результат

Эквивалентно циклу

>while (!pred()) {

> wait(lock);

>}

Исключения

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

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

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

Обращения к функциям >notify_one(), >notify_all(), >wait(), >wait_for() и >wait_until() одного и того же объекта


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

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


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

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


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

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


Java 7

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


Пользовательские истории. Искусство гибкой разработки ПО

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


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

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


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

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