Namespaces
Variants

Standard library header <stop_token> (C++20)

From cppreference.net
Standard library headers

Cet en-tête fait partie de la bibliothèque de support des threads .

J'ai traduit uniquement les éléments textuels non techniques : - "Contents" → "Table des matières" - J'ai conservé tous les termes techniques C++ (stop_token, stop_source, concepts, alias templates, etc.) - Toutes les balises HTML et attributs sont restés inchangés - La structure et la mise en forme originales ont été préservées

Table des matières

Classes

(C++20)
une interface pour interroger si une std::jthread demande d'annulation a été effectuée
(classe)
classe représentant une requête pour arrêter un ou plusieurs std::jthread
(classe)
une interface pour enregistrer des rappels lors de l'annulation std::jthread
(modèle de classe)
fournit une interface de jeton d'arrêt pour laquelle un arrêt n'est jamais possible ni demandé
(classe)
un jeton d'arrêt qui référence l'état d'arrêt de son objet std::inplace_stop_source associé
(classe)
une stoppable-source qui est le seul propriétaire de l'état d'arrêt
(classe)
un callback d'arrêt pour std::inplace_stop_token
(modèle de classe)

Modèles d'alias

obtient le type de rappel pour un type de jeton d'arrêt donné
(modèle d'alias)

Concepts

spécifie l'interface de base des jetons d'arrêt qui permet d'interroger les demandes d'arrêt et de déterminer si une demande d'arrêt est possible
(concept)
spécifie un jeton d'arrêt qui n'autorise pas l'arrêt
(concept)

Étiquettes

une étiquette utilisée pour stop_source pour indiquer l'absence d'état d'arrêt associé lors de la construction
(étiquette)

Synopsis

namespace std {
  // concepts de jeton d'arrêt
  template<class CallbackFn, class Token, class Init = CallbackFn>
    concept /*stoppable-callback-for*/ = /* voir description */; // exposition uniquement
  template<class Token>
    concept stoppable_token = /* voir description */;
  template<class Token>
    concept unstoppable_token = /* voir description */;
  template<class Source>
    concept /*stoppable-source*/ = /* voir description */; // exposition uniquement
  // classe stop_token
  class stop_token;
  // classe stop_source
  class stop_source;
  // indicateur d'absence d'état d'arrêt partagé
  struct nostopstate_t {
    explicit nostopstate_t() = default;
  };
  inline constexpr nostopstate_t nostopstate{};
  // classe template stop_callback
  template<class Callback>
  class stop_callback;
  // classe never_stop_token
  class never_stop_token;
  // classe inplace_stop_token
  class inplace_stop_token;
  // classe inplace_stop_source
  class inplace_stop_source;
  // classe template inplace_stop_callback
  template<class CallbackFn>
    class inplace_stop_callback;
  template<class T, class CallbackFn>
    using stop_callback_for_t = T::template callback_type<CallbackFn>;
}

Concepts de jeton d'arrêt

namespace std {
  template<class CallbackFn, class Token, class Init = CallbackFn>
    concept /*stoppable-callback-for*/ =                         // exposition uniquement
      invocable<CallbackFn> &&
      constructible_from<CallbackFn, Init> &&
      requires { typename stop_callback_for_t<Token, CallbackFn>; } &&
      constructible_from<stop_callback_for_t<Token, CallbackFn>, const Token&, Init>;
  template<template<class> class>
    struct /*check-type-alias-exists*/;                          // exposition uniquement
  template<class Token>
    concept stoppable_token = 
      requires (const Token tok) {
        typename /*check-type-alias-exists*/<Token::template callback_type>;
        { tok.stop_requested() } noexcept -> same_as<bool>;
        { tok.stop_possible() } noexcept -> same_as<bool>;
        { Token(tok) } noexcept; // voir les variations d'expression implicites
      } &&
      copyable<Token> &&
      equality_comparable<Token>;
  template<class Token>
    concept unstoppable_token = 
      stoppable_token<Token> &&
      requires (const Token tok) {
        requires bool_constant<(!tok.stop_possible())>::value;
      };
  template<class Source>
    concept /*stoppable-source*/ =                               // exposition uniquement
      requires (Source& src, const Source csrc) {
        { csrc.get_token() } -> stoppable_token;
        { csrc.stop_possible() } noexcept -> same_as<bool>;
        { csrc.stop_requested() } noexcept -> same_as<bool>;
        { src.request_stop() } -> same_as<bool>;
      };
}

Classe std::stop_token

namespace std {
  class stop_token {
  public:
    template<class CallbackFn>
      using callback_type = stop_callback<CallbackFn>;
    // constructeurs, copie et affectation
    stop_token() noexcept = default;
    // fonctions membres
    void swap(stop_token&) noexcept;
    // gestion de l'arrêt
    bool stop_requested() const noexcept;
    bool stop_possible() const noexcept;
    friend bool operator==(const stop_token& lhs, const stop_token& rhs) noexcept;
    friend void swap(stop_token& lhs, stop_token& rhs) noexcept;
  private:
    shared_ptr</*unspecified*/> stop_state_; // exposition uniquement
  };
}

Classe std::stop_source

namespace std {
  class stop_source {
  public:
    // constructeurs, copie et affectation
    stop_source();
    explicit stop_source(nostopstate_t) noexcept {}
    // fonctions membres
    void swap(stop_source&) noexcept;
    // gestion de l'arrêt
    stop_token get_token() const noexcept;
    bool stop_possible() const noexcept;
    bool stop_requested() const noexcept;
    bool request_stop() noexcept;
    friend bool
    operator==(const stop_source& lhs, const stop_source& rhs) noexcept;
    friend void swap(stop_source& lhs, stop_source& rhs) noexcept;
  private:
    shared_ptr</*unspecified*/> stop_state_; // exposition uniquement
  };
}

Modèle de classe std::stop_callback

namespace std {
  template<class CallbackFn>
  class stop_callback {
  public:
    using callback_type = CallbackFn;
    // constructeurs et destructeur
    template<class Init>
    explicit stop_callback(const stop_token& st, Init&& init)
        noexcept(is_nothrow_constructible_v<CallbackFn, Init>);
    template<class Init>
    explicit stop_callback(stop_token&& st, Init&& init)
        noexcept(is_nothrow_constructible_v<CallbackFn, Init>);
    ~stop_callback();
    stop_callback(const stop_callback&) = delete;
    stop_callback(stop_callback&&) = delete;
    stop_callback& operator=(const stop_callback&) = delete;
    stop_callback& operator=(stop_callback&&) = delete;
  private:
    CallbackFn callback_fn_;      // exposition uniquement
  };
  template<class CallbackFn>
  stop_callback(stop_token, CallbackFn) -> stop_callback<CallbackFn>;
}

Modèle de classe std::never_stop_token

namespace std {
  class never_stop_token {
    struct /*callback-type*/ {       // exposition uniquement
      explicit /*callback-type*/(never_stop_token, auto&&) noexcept {}
    };
  public:
    template<class>
      using callback_type = /*callback-type*/;
    static constexpr bool stop_requested() noexcept { return false; }
    static constexpr bool stop_posible() noexcept { return false; }
    bool operator==(const never_stop_token&) const = default;
  };
}

Modèle de classe std::inplace_stop_token

namespace std {
  class inplace_stop_token {
  public:
    template<class CallbackFn>
      using callback_type = inplace_stop_callback<CallbackFn>;
    inplace_stop_token() = default;
    bool operator==(const inplace_stop_token&) const = default;
    // fonctions membres
    bool stop_requested() const noexcept;
    bool stop_possible() const noexcept;
    void swap(inplace_stop_token&) noexcept;
  private:
    const inplace_stop_source* stop_source_ = nullptr; // exposition uniquement
  };
}

Modèle de classe std::inplace_stop_source

namespace std {
  class inplace_stop_source {
    // constructeurs, assignations et destructeur
    constexpr inplace_stop_source() noexcept;
    inplace_stop_source(inplace_stop_source&&) = delete;
    inplace_stop_source(const inplace_stop_source&) = delete;
    inplace_stop_source& operator=(inplace_stop_source&&) = delete;
    inplace_stop_source& operator=(const inplace_stop_source&) = delete;
    ~inplace_stop_source();
    // gestion de l'arrêt
    constexpr inplace_stop_token get_token() const noexcept;
    static constexpr bool stop_possible() noexcept { return true; }
    bool stop_requested() const noexcept;
    bool request_stop() noexcept;
  };
}

Modèle de classe std::inplace_stop_callback

namespace std {
  template<class CallbackFn>
  class inplace_stop_callback {
  public:
    using callback_type = CallbackFn;
    // constructeurs et destructeur
    template<class Init>
    explicit inplace_stop_callback(inplace_stop_token st, Init&& init)
        noexcept(is_nothrow_constructible_v<CallbackFn, Init>);
    ~inplace_stop_callback();
    inplace_stop_callback(const inplace_stop_callback&) = delete;
    inplace_stop_callback(inplace_stop_callback&&) = delete;
    inplace_stop_callback& operator=(const inplace_stop_callback&) = delete;
    inplace_stop_callback& operator=(inplace_stop_callback&&) = delete;
  private:
    CallbackFn callback_fn_;      // exposition uniquement
  };
  template<class CallbackFn>
  inplace_stop_callback(inplace_stop_token, CallbackFn) 
    -> inplace_stop_callback<CallbackFn>;
}