Middle
O que é std::future em C++?
sobes.tech IA
Resposta da IA
std::future — é uma classe modelo em C++ que representa o resultado (valor ou exceção) de uma operação assíncrona, que estará disponível no futuro. É usado para obter o resultado da execução de uma tarefa iniciada numa thread separada ou através de std::async.
Características principais:
- Assincronismo: Permite realizar uma operação sem bloquear a thread atual.
- Obter resultado: O método
get()permite obter o resultado. Se o resultado ainda não estiver pronto,get()bloqueará a thread atual até que esteja ou até que uma exceção seja lançada. - Transferência de dados: Associado a um objeto
std::promise, que fornece uma forma de definir o resultado ou a exceção. - Estado:
std::futuretem um estado que indica se o resultado está pronto. Pode ser verificado comwait()ouwait_for(). - Obtenção única: O método
get()só pode ser chamado uma vez por cada objetostd::future. - Tipo de resultado: Tipado pelo tipo de valor retornado pela operação assíncrona.
Exemplo de uso com std::async:
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int calculate_something() {
std::this_thread::sleep_for(std::chrono::seconds(1));
return 42;
}
// Exemplo de uso de std::future com std::async
int main() {
// Inicia uma operação assíncrona
std::future<int> result_future = std::async(std::launch::async, calculate_something);
// Realiza outra tarefa enquanto a operação é calculada
std::cout << "A fazer algo mais..." << std::endl;
// Obtém o resultado (bloqueia se não estiver pronto)
int result = result_future.get();
std::cout << "Resultado é: " << result << std::endl;
return 0;
}
Exemplo de uso com std::promise:
#include <future>
#include <thread>
#include <iostream>
void worker_function(std::promise<int> promise_obj) {
std::this_thread::sleep_for(std::chrono::seconds(1));
// Define o resultado
promise_obj.set_value(123);
}
// Exemplo de uso de std::future com std::promise
int main() {
// Cria promise e future
std::promise<int> promise_obj;
std::future<int> future_obj = promise_obj.get_future();
// Inicia um worker numa thread separada, passando o promise
std::thread worker_thread(worker_function, std::move(promise_obj));
// Realiza outra tarefa enquanto o worker trabalha
std::cout << "A fazer algo mais..." << std::endl;
// Obtém o resultado (bloqueia se não estiver pronto)
int result = future_obj.get();
std::cout << "Resultado do worker: " << result << std::endl;
// Espera que o worker termine
worker_thread.join();
return 0;
}
Métodos importantes de std::future:
| Método | Descrição |
|---|---|
get() |
Obtém o resultado. Bloqueia se o resultado ainda não estiver pronto. Pode ser chamado apenas uma vez. |
valid() |
Verifica se std::future está associado a uma operação assíncrona em curso. |
wait() |
Bloqueia o thread atual até que o resultado esteja disponível (ou uma exceção seja lançada). |
wait_for() |
Aguarda o resultado durante um intervalo de tempo especificado. Retorna o estado de espera. |
wait_until() |
Aguarda o resultado até um momento específico no tempo. Retorna o estado de espera. |
std::future faz parte da biblioteca <future> e fornece uma maneira conveniente de gerenciar os resultados de cálculos assíncronos, simplificando o desenvolvimento de aplicações multithread.