std::execution:: scheduler
| 
           
           Défini dans l'en-tête
            
         
            
             <execution>
            
           
           | 
         ||
| 
           
           
            
             template
            
            
             <
            
            
             class
            
            Sch
            
             >
            
             
         
             concept scheduler
             
              =
             
               | 
         (1) | (depuis C++26) | 
| 
           
           Type d'étiquette d'assistance
           
          | 
         ||
| 
           
           
            
             struct
            
            scheduler_t
            
             {
            
            
             }
            
            
             ;
            
           
           
          | 
         (2) | (depuis C++26) | 
       Le concept
       
        scheduler
       
       est modélisé par des types qui sont
       
        des planificateurs
       
       , c'est-à-dire des gestionnaires légers de ressources d'exécution tels que des pools de threads qui fonctionnent avec la bibliothèque d'exécution C++.
      
Exigences sémantiques
       Étant donné un planificateur de type
       
        Sch
       
       et un environnement d'exécution de type
       
        Env
       
       tels que
       
        
         sender_in
         
          <
         
         schedule_result_t
         
          <
         
         Sch
         
          >
         
         , Env
         
          >
         
        
       
       est satisfait, alors
       
        
         
          /*sender-in-of*/
         
         
          <
         
         schedule_result_t
         
          <
         
         Sch
         
          >
         
         , Env
         
          >
         
        
       
       est modélisé.
      
Le constructeur de copie, le destructeur, la comparaison d'égalité ou les fonctions membres d'échange du planificateur doivent être non générateurs d'exceptions.
       Toutes ces fonctions membres ainsi que la fonction
       
        schedule
       
       du type planificateur doivent être thread-safe.
      
Deux ordonnanceurs sont égaux uniquement s'ils représentent la même ressource d'exécution.
       Pour un planificateur donné
       
        sch
       
       , l'expression
       
        
         get_completion_scheduler
         
          <
         
         set_value_t
         
          >
         
         
          (
         
         get_env
         
          (
         
         schedule
         
          (
         
         sch
         
          )
         
         
          )
         
         
          )
         
        
       
       est égale à
       
        sch
       
       .
      
       Pour un planificateur donné
       
        sch
       
       , si l'expression
       
        
         get_domain
         
          (
         
         sch
         
          )
         
        
       
       est bien formée, alors l'expression
       
        
         get_domain
         
          (
         
         get_env
         
          (
         
         schedule
         
          (
         
         sch
         
          )
         
         
          )
         
         
          )
         
        
       
       est également bien formée et a le même type.
      
Le destructeur d'un planificateur ne doit pas bloquer en attendant l'achèvement des récepteurs connectés aux objets émetteurs retournés par schedule (la ressource sous-jacente peut fournir une API distincte pour attendre l'achèvement des objets fonction soumis)
Exemples
Enrobage simple pour std::execution::run_loop qui interroge constamment la file d'attente de run_loop sur un seul thread dédié. Démonstration utilisant l'implémentation de référence préliminaire : 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 << "Hello world! Have an int.\n"; return 015; }) | std::execution::then([](int arg) { return arg + 42; }); auto [i] = std::this_thread::sync_wait(snd).value(); std::cout << "Back in the main thread, result is " << i << '\n'; }
Sortie :
Hello world! Have an int. Back in the main thread, result is 55
Voir aussi
| 
          
           
            
             
              (C++26)
             
            
           
           
          | 
        
         prépare un graphe de tâches pour l'exécution sur un ordonnanceur donné
          (objet de point de personnalisation)  |