Espacios de nombres
Variantes
Acciones

std::execution::scheduler

De cppreference.com
< cpp‎ | execution
 
 
 
Definido en el archivo de encabezado <execution>
template< class Sch >

concept scheduler =
    std::derived_from<
        typename std::remove_cvref_t<Sch>::scheduler_concept,
        scheduler_t> &&
    /*consultable*/<Sch> &&
    requires(Sch&& sch)
    {
        {
            std::execution::schedule(std::forward<Sch>(sch))
        } -> std::execution::sender;
        {
            auto(
                std::execution::get_completion_scheduler<
                    std::execution::set_value_t>(
                        std::execution::get_env(
                            std::execution::schedule(
                                std::forward<Sch>(sch)))))
        } -> std::same_as<std::remove_cvref_t<Sch>>;
    } &&
    std::equality_comparable<std::remove_cvref_t<Sch>> &&
    std::copy_constructible<std::remove_cvref_t<Sch>>;

};
(1) (desde C++26)
Tipo etiqueta auxiliar
struct scheduler_t {};
(2) (desde C++26)

El concepto scheduler se modela mediante tipos que son planificadores, es decir, controladores livianos para recursos de ejecución como reservas de hilos que funcionan con la biblioteca de ejecución de C++.

[editar] Requisitos semánticos

Dado un planificador de tipo Sch y un entorno de ejecución de tipo Env tal que se satisface sender_in<schedule_result_t<Sch>, Env>, entonces se modela /*sender-in-of*/<schedule_result_t<Sch>, Env>.

Las funciones miembro de constructor de copia, destructor, comparación de igualdad o intercambio del planificador no deben lanzar excepciones.

Todas esas funciones miembro, así como la función schedule del tipo planificador, deben ser seguras frente a hilos.

Dos planificadores son iguales solo si representan el mismo recurso de ejecución.

Para un planificador sch determinado, la expresión get_completion_scheduler<set_value_t>(get_env(schedule(sch))) es igual a sch.

Para un planificador sch determinado, si la expresión get_domain(sch) está bien formada, entonces la expresión get_domain(get_env(schedule(sch))) también está bien formada y tiene el mismo tipo.

El destructor de un planificador no debe bloquearse mientras se completa la ejecución de ningún receptor conectado a los objetos remitentes devueltos desde la planificación (el recurso subyacente puede proporcionar una API independiente para esperar la terminación de los objetos función sometidos).

[editar] Ejemplo

Envoltorio simple para std::execution::run_loop que sondea constantemente la cola de run_loop en un único hilo dedicado. Demostración con implementación de referencia preliminar: https://godbolt.org/z/146fY4Y91

#include <execution>
#include <iostream>
#include <thread>
 
class single_thread_context
{
    std::execution::run_loop loop_{};
    std::jthread thread_;
 
public:
    single_thread_context()
        : thread_([this] { loop_.run(); })
    {}
    single_thread_context(single_thread_context&&) = delete;
 
    ~single_thread_context()
    {
        loop_.finish();
    }
 
    std::execution::scheduler auto get_scheduler() noexcept
    {
        return loop_.get_scheduler();
    }
};
 
int main()
{
    single_thread_context ctx;
 
    std::execution::sender auto snd =
        std::execution::schedule(ctx.get_scheduler())
        | std::execution::then([]
            {
                std::cout << "¡Hola mundo! Ten un entero.\n";
                return 015;
            })
        | std::execution::then([](int arg) { return arg + 42; });
 
    auto [i] = std::this_thread::sync_wait(snd).value();
 
    std::cout << "Volviendo al hilo principal, el resultado es " << i << '\n';
}

Salida:

¡Hola mundo! Ten un entero.
Volviendo al hilo principal, el resultado es 55

[editar] Véase también

Prepara un grafo de tareas para su ejecución en un planificador determinado.
(objeto punto de personalización) [editar]