std::condition_variable::wait_until
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
<metanoindex/>
<tbody> </tbody> template< class Clock, class Duration > std::cv_status wait_until( std::unique_lock<std::mutex>& lock, const std::chrono::time_point<Clock, Duration>& abs_time); |
(1) | (начиная с C++11) |
template< class Clock, class Duration, class Predicate > bool wait_until( std::unique_lock<mutex>& lock, const std::chrono::time_point<Clock, Duration>& abs_time, Predicate pred); |
(2) | (начиная с C++11) |
wait_until вызывает текущий поток, чтобы блокировать до тех пор пока переменная условия уведомление, определенное время будет достигнута, или ложные пробуждения происходит, необязательно цикл, пока некоторый предикат выполняется.Оригинал:
wait_until causes the current thread to block until the condition variable is notified, a specific time is reached, or a spurious wakeup occurs, optionally looping until some predicate is satisfied.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
1)
Атомно-релизы
lock, блоки текущего потока выполнения, и добавляет его в список ожидающих потоков на *this. Тема будет разблокирован, когда notify_all() или notify_one() выполнена, или когда абсолютное abs_time момент времени будет достигнута. Он также может быть разблокирован ложно. Когда разблокирован, независимо от причины, lock является вновь приобретенных и wait_until выходит. Если эта функция выходит через исключение, 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, or when the absolute time point abs_time is reached. It may also be unblocked spuriously. When unblocked, regardless of the reason, lock is reacquired and wait_until exits. If this function exits via exception, lock is also reacquired.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
Эквивалент
Оригинал:
Equivalent to
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
while (!pred()) if (wait_until(lock, abs_time) == std::cv_status::timeout) return pred(); return true;
Эта перегрузка может быть использован для игнорирования ложных пробуждений.
Оригинал:
This overload may be used to ignore spurious wakeups.
Текст был переведён автоматически используя Переводчик 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. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| abs_time | — | Объект типа std::chrono::time_point, представляющее время, когда нужно остановиться ожидания
Оригинал: an object of type std::chrono::time_point representing the time when to stop waiting Текст был переведён автоматически используя Переводчик 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:
|
Возвращаемое значение
1)
std::cv_status::timeout, если абсолютное таймаута, указанного в
abs_time была достигнута, std::cv_status::no_timeout overwise.Оригинал:
std::cv_status::timeout if the absolute timeout specified by
abs_time was reached, std::cv_status::no_timeout overwise.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
2)
false если предикат pred по-прежнему оценивается как false после abs_time тайм-аут истек, в противном случае true.Оригинал:
false if the predicate pred still evaluates to false after the abs_time timeout expired, otherwise true.Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Исключения
Может бросить 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 <atomic>
#include <condition_variable>
#include <thread>
#include <chrono>
std::condition_variable cv;
std::mutex cv_m;
std::atomic<int> i = ATOMIC_VAR_INIT(0);
void waits(int idx)
{
std::unique_lock<std::mutex> lk(cv_m);
auto now = std::chrono::system_clock::now();
if(cv.wait_until(lk, now + std::chrono::milliseconds(idx*100), [](){return i == 1;}))
std::cerr << "Thread " << idx << " finished waiting. i == " << i << '\n';
else
std::cerr << "Thread " << idx << " timed out. i == " << i << '\n';
}
void signals()
{
std::this_thread::sleep_for(std::chrono::milliseconds(120));
std::cerr << "Notifying...\n";
cv.notify_all();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
i = 1;
std::cerr << "Notifying again...\n";
cv.notify_all();
}
int main()
{
std::thread t1(waits, 1), t2(waits, 2), t3(waits, 3), t4(signals);
t1.join();
t2.join();
t3.join();
t4.join();
}
Возможный вывод:
Thread 1 timed out. i == 0
Notifying...
Thread 2 timed out. i == 0
Notifying again...
Thread 3 finished waiting. i == 1
См. также
| блокирует текущий поток до тех пор, пока условная переменная не будет активирована (public функция-элемент) | |
| блокирует текущий поток до тех пор, пока условная переменная не будет активирована или по истечении указанного времени ожидания (public функция-элемент) |