std::condition_variable
De cppreference.com
| Definido no cabeçalho <condition_variable>
|
||
class condition_variable; |
(desde C++11) | |
A classe
condition_variable é um primitivo de sincronização que pode ser utilizado para bloquear um segmento, ou vários segmentos, ao mesmo tempo, até que:Original:
The
condition_variable class is a synchronization primitive that can be used to block a thread, or multiple threads at the same time, until:The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
- uma notificação for recebida de outro segmentoOriginal:a notification is received from another threadThe text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions. - um tempo limite expirar, ouOriginal:a timeout expires, orThe text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions. - um wakeup espúria ocorreOriginal:a wakeup espúria occursThe text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
Qualquer segmento que pretende esperar
std::condition_variable tem de adquirir uma std::unique_lock primeiro. As operações de espera atomicamente liberar o mutex e suspender a execução da rosca. Quando a variável de condição é notificado, o fio é despertada, e o mutex é readquirida.Original:
Any thread that intends to wait on
std::condition_variable has to acquire a std::unique_lock first. The wait operations atomically release the mutex and suspend the execution of the thread. When the condition variable is notified, the thread is awakened, and the mutex is reacquired.The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
O
std::condition_variable classe é um StandardLayoutType. Não é CopyConstructible, MoveConstructible, CopyAssignable, MoveAssignable.Original:
The class
std::condition_variable is a StandardLayoutType. It is not CopyConstructible, MoveConstructible, CopyAssignable, MoveAssignable.The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
Tipos de membro
Tipo de membro
Original: Member type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
Definition |
native_handle_type
|
Definida pela implementação
Original: implementation-defined The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
Funções de membro
Exemplo
#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();
}
Potencial saída:
producing 0
consuming 0
producing 1
consuming 1
producing 2
consuming 2
producing 3
consuming 3
producing 4
consuming 4
