Espacios de nombres
Variantes

std::execution::scheduler

De cppreference.com
 
 
 
<tbody> </tbody>
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++.

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).

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

Véase también

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