Пространства имён
Варианты
Действия

std::condition_variable::wait

Материал из cppreference.com

 
 
Библиотека поддержки конкуренции
Ветви
(C++11)
(C++20)
(C++20)
Пространство имён this_thread
(C++11)
(C++11)
(C++11)
Атомарные типы
(C++11)
(C++20)
Инициализация атомарных типов
(C++11)(устарело в C++20)
(C++11)(устарело в C++20)
(C++11)(устарело в C++20)
Функции освобождения для атомарных операций
Функции освобождения для атомарных флагов
Упорядочивание памяти
Взаимное исключение
Общее управление блокировкой
(C++11)
(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Условные переменные
(C++11)
Семафоры
Защёлки и барьеры
(C++20)
(C++20)
Фьючерсы
(C++11)
(C++11)
(C++11)
 
 
void wait(std::unique_lock<std::mutex>& lock );
(1) (начиная с C++11)
template<class Predicate >
void wait(std::unique_lock<std::mutex>& lock, Predicate pred );
(2) (начиная с C++11)
wait вызывает текущий поток, чтобы блокировать до тех пор пока переменная условия уведомления или ложные пробуждения происходит, необязательно цикл, пока некоторый предикат выполняется.
Оригинал:
wait causes the current thread to block until the condition variable is notified or a spurious wakeup occurs, optionally looping until some predicate is satisfied.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
1)
Атомно-релизы lock, блоки текущего потока выполнения, и добавляет его в список ожидающих потоков на *this. Тема будет разблокирован, когда notify_all() или notify_one() выполняется. Он также может быть разблокирован ложно. Когда разблокирован, независимо от причины, lock является вновь приобретенных и wait выходит. Если эта функция выходит через исключение, lock также приобрело.
Оригинал:
Atomically releases lock, blocks the current executing thread, and adds it to the list of threads waiting on *this. The thread will be unblocked when notify_all() or notify_one() is executed. It may also be unblocked spuriously. When unblocked, regardless of the reason, lock is reacquired and wait exits. If this function exits via exception, lock is also reacquired.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
Эквивалент
Оригинал:
Equivalent to
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

while(!pred()){
  wait(lock);
}

Эта перегрузка может быть использован для игнорирования ложных пробуждений в ожидании конкретных условий, чтобы стать правдой.
Оригинал:
This overload may be used to ignore spurious awakenings while waiting for a specific condition to become true.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править]Параметры

lock
Объект типа std::unique_lock<std::mutex>, которые должны быть заблокированы текущего потока
Оригинал:
an object of type std::unique_lock<std::mutex>, which must be locked by the current thread
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
pred predicate which returns ​false
если ожидание должно быть продолжено
Оригинал:
if the waiting should be continued
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
.

The signature of the predicate function should be equivalent to the following:

 bool pred();

[править]Возвращаемое значение

(Нет)

[править]Исключения

Может бросить std::system_error, также могут распространяться исключения, lock.lock() или lock.unlock().
Оригинал:
May throw std::system_error, may also propagate exceptions thrown by lock.lock() or lock.unlock().
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править]Notes

Вызов этой функции, если lock.mutex() не заблокирован текущим потоком неопределенное поведение.
Оригинал:
Calling this function if lock.mutex() is not locked by the current thread is undefined behavior.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вызов этой функции, если lock.mutex() это не то же мьютекса, который используется всеми другими потоками, которые в настоящее время ждет на той же переменной условие неопределенное поведение.
Оригинал:
Calling this function if lock.mutex() is not the same mutex as the one used by all other threads that are currently waiting on the same condition variable is undefined behavior.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править]Пример

#include <iostream>#include <condition_variable>#include <thread>#include <chrono>   std::condition_variable cv;std::mutex cv_m;int i =0;   void waits(){std::unique_lock<std::mutex> lk(cv_m);std::cerr<<"Waiting... \n"; cv.wait(lk, [](){return i ==1;});std::cerr<<"...finished waiting. i == 1\n";}   void signals(){std::this_thread::sleep_for(std::chrono::seconds(1));std::cerr<<"Notifying...\n"; cv.notify_all();std::this_thread::sleep_for(std::chrono::seconds(1)); i =1;std::cerr<<"Notifying again...\n"; cv.notify_all();}   int main(){std::thread t1(waits), t2(waits), t3(waits), t4(signals); t1.join(); t2.join(); t3.join(); t4.join();}

Вывод:

Waiting... Waiting... Waiting... Notifying... Notifying again... ...finished waiting. i == 1 ...finished waiting. i == 1 ...finished waiting. i == 1

[править]См. также

блокирует текущий поток до тех пор, пока условная переменная не будет активирована или по истечении указанного времени ожидания
(public функция-элемент)[править]
блокирует текущий поток до тех пор, пока условная переменная не будет активирована или пока не будет достигнут указанный момент времени
(public функция-элемент)[править]
close