std::condition_variable
Материал из cppreference.com
Определено в заголовочном файле <condition_variable>
|
||
class condition_variable; |
(начиная с C++11) | |
Класс condition_variable
является примитивом синхронизации, который может быть использован для блокирования потока или нескольких потоков одновременно, пока не произойдет любое из событий:
- будет получено извещение из другого потока
- выйдет тайм-аут, или
- произойдет ложное пробуждение
Любой поток, который намерен ждать на std::condition_variable
должен сначала приобрести std::unique_lock. Операция ожидания атомарно освобождает мьютекс и приостанавливает выполнение потока. Когда переменная условия уведомляется, поток пробуждается, и мьютекс снова приобретается.
Класс std::condition_variable
является StandardLayoutType
. Не является CopyConstructible
, MoveConstructible
, CopyAssignable
, MoveAssignable
.
Содержание |
[править] Типы-члены
Тип члена | Определение |
native_handle_type
|
Определяется реализацией
Оригинал: implementation-defined Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
[править] Функции-члены
Строит объект Оригинал: constructs the object Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) | |
разрушает объект Оригинал: destructs the object Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) | |
operator= [удалено] |
Не копируемый Оригинал: not copy-assignable Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) |
Уведомления | |
уведомляет один ожидающий поток Оригинал: notifies one waiting thread Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) | |
уведомляет все ожидающие потоки (public функция-член) | |
Ожидание | |
блокирует текущий поток до тех пор пока переменная не будет пробужена Оригинал: blocks the current thread until the condition variable is woken up Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) | |
блокирует текущий поток до тех пор пока переменная условия проснулась или после указанного периода тайм-аута Оригинал: blocks the current thread until the condition variable is woken up or after the specified timeout duration Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) | |
блокирует текущий поток до тех пор пока переменная условия проснулся или до указанного момента времени была достигнута Оригинал: blocks the current thread until the condition variable is woken up or until specified time point has been reached Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (public функция-член) | |
Системный дескриптор | |
возвращается системный дескриптор (public функция-член) |
[править] Пример
Запустить этот код
#include <condition_variable> #include <mutex> #include <thread> #include <iostream> #include <queue> #include <chrono> int main() { std::queue<int> produced_nums; std::mutex m; std::condition_variable cond_var; bool done = false; bool notified = false; std::thread producer([&]() { for (int i = 0; i < 5; ++i) { std::this_thread::sleep_for(std::chrono::seconds(1)); std::unique_lock<std::mutex> lock(m); std::cout << "producing " << i << '\n'; produced_nums.push(i); notified = true; cond_var.notify_one(); } done = true; cond_var.notify_one(); }); std::thread consumer([&]() { std::unique_lock<std::mutex> lock(m); while (!done) { while (!notified) { // loop to avoid spurious wakeups cond_var.wait(lock); } while (!produced_nums.empty()) { std::cout << "consuming " << produced_nums.front() << '\n'; produced_nums.pop(); } notified = false; } }); producer.join(); consumer.join(); }
Возможный вывод:
producing 0 consuming 0 producing 1 consuming 1 producing 2 consuming 2 producing 3 consuming 3 producing 4 consuming 4