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

std::condition_variable::wait_for

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

 
 
Библиотека поддержки потоков
Потоки
Оригинал:
Threads
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
thread(C++11)
this_thread имен
Оригинал:
this_thread namespace
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
get_id(C++11)
yield(C++11)
sleep_for(C++11)
sleep_until(C++11)
Взаимное исключение
Оригинал:
Mutual exclusion
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
mutex(C++11)
timed_mutex(C++11)
Generic управления замком
Оригинал:
Generic lock management
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
lock_guard(C++11)
unique_lock(C++11)
defer_lock_t
try_to_lock_t
adopt_lock_t
(C++11)
(C++11)
(C++11)
lock(C++11)
try_lock(C++11)
defer_lock
try_to_lock
adopt_lock
(C++11)
(C++11)
(C++11)
Условия переменных
Оригинал:
Condition variables
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
condition_variable(C++11)
condition_variable_any(C++11)
notify_all_at_thread_exit(C++11)
cv_status(C++11)
Futures
Оригинал:
Futures
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
promise(C++11)
future(C++11)
shared_future(C++11)
packaged_task(C++11)
async(C++11)
launch(C++11)
future_status(C++11)
future_error(C++11)
future_category(C++11)
future_errc(C++11)
 
std::condition_variable
Член функций
Оригинал:
Member functions
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
condition_variable::condition_variable
condition_variable::~condition_variable
Уведомление
Оригинал:
Notification
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
condition_variable::notify_one
condition_variable::notify_all
Ожидание
Оригинал:
Waiting
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
condition_variable::wait
condition_variable::wait_for
condition_variable::wait_until
Родные ручки
Оригинал:
Native handle
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
condition_variable::native handle
 
template< class Rep, class Period >

std::cv_status wait_for( std::unique_lock<std::mutex>& lock,

                         const std::chrono::duration<Rep, Period>& rel_time);
(1) (начиная с C++11)
template< class Rep, class Period, class Predicate >

bool wait_for( std::unique_lock<std::mutex>& lock,
               const std::chrono::duration<Rep, Period>& rel_time,

               Predicate pred);
(2) (начиная с C++11)
1)
Атомно-релизы lock, блоки текущего потока выполнения, и добавляет его в список ожидающих потоков на *this. Поток будет разблокирован, когда notify_all() или notify_one() выполнена, или когда относительная rel_time тайм-аута. Он также может быть разблокирован ложно. Когда разблокирован, независимо от причины, lock является вновь приобретенных и wait_for() выходит. Если эта функция выходит через исключение, 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 relative timeout rel_time expires. It may also be unblocked spuriously. When unblocked, regardless of the reason, lock is reacquired and wait_for() exits. If this function exits via exception, lock is also reacquired.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
Эквивалент
Оригинал:
Equivalent to
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

while (!pred())
    if (wait_for(lock, rel_time) == std::cv_status::timeout)
        return pred();
return true;

Эта перегрузка может быть использован для игнорирования ложных пробуждений.
Оригинал:
This overload may be used to ignore spurious awakenings.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

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

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

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

 bool pred();

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

1)
std::cv_status::timeout, если относительная таймаута, указанного в rel_time истек, std::cv_status::no_timeout overwise.
Оригинал:
std::cv_status::timeout if the relative timeout specified by rel_time expired, std::cv_status::no_timeout overwise.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
2)
false если предикат pred по-прежнему оценивается как false после rel_time тайм-аут истек, в противном случае true.
Оригинал:
false if the predicate pred still evaluates to false after the rel_time timeout expired, otherwise true.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

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

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

[править] Notes

Вызов этой функции, если lock.mutex() не заблокирован текущим потоком неопределенное поведение.
Оригинал:
Calling this function if lock.mutex() is not locked by the current thread is undefined behavior.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Вызов этой функции, если 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 Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

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

#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);
    if(cv.wait_for(lk, 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

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

блокирует текущий поток до тех пор пока переменная условия проснулся
Оригинал:
blocks the current thread until the condition variable is woken up
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]
блокирует текущий поток до тех пор пока переменная условия проснулся или до указанного момента времени была достигнута
Оригинал:
blocks the current thread until the condition variable is woken up or until specified time point has been reached
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(public функция-член) [edit]