<condition_variable><condition_variable>

Определяет классы condition_variable и condition_variable_any , используемые для создания объектов, которые ожидают условие, чтобы стать true.Defines the classes condition_variable and condition_variable_any that are used to create objects that wait for a condition to become true.

Этот заголовок использует среду выполнения с параллелизмом (ConcRT), чтобы ее можно было использовать вместе с другими механизмами ConcRT.This header uses Concurrency Runtime (ConcRT) so that you can use it together with other ConcRT mechanisms. Дополнительные сведения о ConcRT см. в статье Среда выполнения с параллелизмом.For more information about ConcRT, see Concurrency Runtime.

ТребованияRequirements

Заголовок:<condition_variable>Header: <condition_variable>

Пространство имен: stdNamespace: std

Примечание

В коде, компилируемом с помощью /CLR, этот заголовок блокируется.In code that is compiled by using /clr, this header is blocked.

КомментарииRemarks

Код, который ожидает переменную условия, должен также использовать mutex.Code that waits for a condition variable must also use a mutex. Вызывающий поток должен заблокировать mutex перед вызовом функции, ожидающей переменную условия.A calling thread must lock the mutex before it calls the functions that wait for the condition variable. Затем блокируется mutex при возврате вызванной функции.The mutex is then locked when the called function returns. mutex не блокируется, пока поток ожидает, когда условие станет истинным.The mutex is not locked while the thread waits for the condition to become true. Таким образом, нет никаких непредсказуемых результатов, все потоки, ожидающие переменную условия, должны использовать один и тот же объект mutex.So that there are no unpredictable results, each thread that waits for a condition variable must use the same mutex object.

Объекты типа condition_variable_any можно использовать с mutex любого типа.Objects of type condition_variable_any can be used with a mutex of any type. Используемый тип mutex не должен предоставлять метод try_lock.The type of the mutex that is used does not have to provide the try_lock method. Объекты типа condition_variable можно использовать с mutex типа unique_lock<mutex>.Objects of type condition_variable can only be used with a mutex of type unique_lock<mutex>. Объекты этого типа могут быть быстрее, чем объекты типа condition_variable_any<unique_lock<mutex>>.Objects of this type may be faster than objects of type condition_variable_any<unique_lock<mutex>>.

Чтобы дождаться события, сначала блокируется mutex, а затем вызывается один из методов wait в переменной условия.To wait for an event, first lock the mutex, and then call one of the wait methods on the condition variable. Вызов wait блокируется, пока другой поток не сигнализирует о переменной условия.The wait call blocks until another thread signals the condition variable.

Ложные активации возникают, когда потоки, ожидающие переменных условия, становятся разблокированными без соответствующих уведомлений.Spurious wakeups occur when threads that are waiting for condition variables become unblocked without appropriate notifications. Чтобы распознать такие ложные активации, код, который ожидает, пока условие станет истинным, должен явно проверять это условие при возврате кода из функции wait.To recognize such spurious wakeups, code that waits for a condition to become true should explicitly check that condition when the code returns from a wait function. Обычно это делается с помощью цикла; можно использовать wait(unique_lock<mutex>& lock, Predicate pred) для выполнения этого цикла.This is usually done by using a loop; you can use wait(unique_lock<mutex>& lock, Predicate pred) to perform this loop for you.

while (condition is false)
    wait for condition variable;

Классы condition_variable_any и condition_variable имеют по три метода, которые ожидают условие.The condition_variable_any and condition_variable classes each have three methods that wait for a condition.

  • Метод wait ожидает в течение неограниченного времени.wait waits for an unbounded time period.

  • Метод wait_until ожидает до указанного time.wait_until waits until a specified time.

  • Метод wait_for ожидает в течение указанного time interval.wait_for waits for a specified time interval.

Каждый из этих методов имеет две перегруженные версии.Each of these methods has two overloaded versions. Одна просто ожидает и может выполнить ложную активацию.One just waits and can wake up spuriously. Другая принимает дополнительный аргумент шаблона, который задает предикат.The other takes an additional template argument that defines a predicate. Метод не возвращает значение, пока предикат не будет true .The method does not return until the predicate is true.

У каждого класса также есть два метода, которые используются для уведомления переменной условия о том, что ее условие имеет значение true .Each class also has two methods that are used to notify a condition variable that its condition is true.

  • notify_one активирует один из потоков, ожидающий переменную условия.notify_one wakes up one of the threads that is waiting for the condition variable.

  • notify_all активирует все потоки, ожидающие переменную условия.notify_all wakes up all of the threads that are waiting for the condition variable.

Функции и перечисленияFunctions and Enums

void notify_all_at_thread_exit(condition_variable& cond, unique_lock<mutex> lk);

enum class cv_status { no_timeout, timeout };

См. также разделSee also

Справочник по файлам заголовковHeader Files Reference
Класс condition_variablecondition_variable Class
Класс condition_variable_anycondition_variable_any Class