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

std::condition_variable

Материал из cppreference.com
< cpp‎ | thread
 
 
Библиотека поддержки потоков
Потоки
Оригинал:
Threads
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
thread(C++11)
this_thread имен
Оригинал:
this_thread namespace
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
get_id(C++11)
yield(C++11)
sleep_for(C++11)
sleep_until(C++11)
Взаимное исключение
Оригинал:
Mutual exclusion
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
mutex(C++11)
timed_mutex(C++11)
Generic управления замком
Оригинал:
Generic lock management
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
condition_variable(C++11)
condition_variable_any(C++11)
notify_all_at_thread_exit(C++11)
cv_status(C++11)
Futures
Оригинал:
Futures
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
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.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
condition_variable::condition_variable
condition_variable::~condition_variable
Уведомление
Оригинал:
Notification
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
condition_variable::notify_one
condition_variable::notify_all
Ожидание
Оригинал:
Waiting
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
condition_variable::wait
condition_variable::wait_for
condition_variable::wait_until
Родные ручки
Оригинал:
Native handle
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
condition_variable::native handle
 
Определено в заголовочном файле <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 функция-член) [edit]
разрушает объект
Оригинал:
destructs the object
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член) [edit]
operator=
[удалено]
Не копируемый
Оригинал:
not copy-assignable
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член) [edit]
Уведомление
Оригинал:
Notification
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
уведомляет один ожидающий поток
Оригинал:
notifies one waiting thread
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

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

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

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

(public функция-член) [edit]
Родные ручки
Оригинал:
Native handle
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
возвращается системный дескриптор
(public функция-член) [edit]

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

#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