Namespaces
Variants

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

From cppreference.net
Standard library headers

Este encabezado es parte de la biblioteca de soporte para hilos .

Contenidos

Clases

(C++20)
una interfaz para consultar si se ha realizado una std::jthread solicitud de cancelación
(clase)
clase que representa una solicitud para detener uno o más std::jthread s
(clase)
una interfaz para registrar callbacks en la cancelación de std::jthread
(plantilla de clase)
proporciona una interfaz de token de parada que nunca permite ni solicita una parada
(clase)
un token de parada que referencia el estado de parada de su objeto std::inplace_stop_source asociado
(clase)
un stoppable-source que es el único propietario del estado de parada
(clase)
una devolución de llamada de parada para std::inplace_stop_token
(plantilla de clase)

Plantillas de alias

obtiene el tipo de callback para un tipo de token de parada dado
(plantilla de alias)

Conceptos

especifica la interfaz básica de los tokens de parada que permite consultar solicitudes de parada y si la solicitud de parada es posible
(concept)
especifica un token de parada que no permite detenerse
(concept)

Etiquetas

una etiqueta utilizada para stop_source para indicar que no hay un estado de parada asociado tras la construcción
(etiqueta)

Sinopsis

namespace std {
  // conceptos de token de parada
  template<class CallbackFn, class Token, class Init = CallbackFn>
    concept /*stoppable-callback-for*/ = /* ver descripción */; // solo para exposición
  template<class Token>
    concept stoppable_token = /* ver descripción */;
  template<class Token>
    concept unstoppable_token = /* ver descripción */;
  template<class Source>
    concept /*stoppable-source*/ = /* ver descripción */; // solo para exposición
  // clase stop_token
  class stop_token;
  // clase stop_source
  class stop_source;
  // indicador de estado de parada sin compartir
  struct nostopstate_t {
    explicit nostopstate_t() = default;
  };
  inline constexpr nostopstate_t nostopstate{};
  // plantilla de clase stop_callback
  template<class Callback>
  class stop_callback;
  // clase never_stop_token
  class never_stop_token;
  // clase inplace_stop_token
  class inplace_stop_token;
  // clase inplace_stop_source
  class inplace_stop_source;
  // plantilla de clase 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>;
}

Conceptos de token de parada

namespace std {
  template<class CallbackFn, class Token, class Init = CallbackFn>
    concepto /*stoppable-callback-for*/ =                         // solo para exposición
      invocable<CallbackFn> &&
      constructible_from<CallbackFn, Init> &&
      requiere { 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*/;                          // solo para exposición
  template<class Token>
    concepto stoppable_token = 
      requiere (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; // ver variaciones de expresión implícita
      } &&
      copyable<Token> &&
      equality_comparable<Token>;
  template<class Token>
    concepto unstoppable_token = 
      stoppable_token<Token> &&
      requiere (const Token tok) {
        requiere bool_constant<(!tok.stop_possible())>::value;
      };
  template<class Source>
    concepto /*stoppable-source*/ =                               // solo para exposición
      requiere (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>;
      };
}

Clase std::stop_token

namespace std {
  class stop_token {
  public:
    template<class CallbackFn>
      using callback_type = stop_callback<CallbackFn>;
    // constructores, copia y asignación
    stop_token() noexcept = default;
    // funciones miembro
    void swap(stop_token&) noexcept;
    // manejo de parada
    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_; // solo para exposición
  };
}

Clase std::stop_source

namespace std {
  class stop_source {
  public:
    // constructores, copia y asignación
    stop_source();
    explicit stop_source(nostopstate_t) noexcept {}
    // funciones miembro
    void swap(stop_source&) noexcept;
    // manejo de parada
    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_; // solo para exposición
  };
}

Plantilla de clase std::stop_callback

namespace std {
  template<class CallbackFn>
  class stop_callback {
  public:
    using callback_type = CallbackFn;
    // constructores y destructor
    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_;      // solo para exposición
  };
  template<class CallbackFn>
  stop_callback(stop_token, CallbackFn) -> stop_callback<CallbackFn>;
}

Plantilla de clase std::never_stop_token

namespace std {
  class never_stop_token {
    struct /*callback-type*/ {       // solo para exposición
      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;
  };
}

Plantilla de clase 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;
    // funciones miembro
    bool stop_requested() const noexcept;
    bool stop_possible() const noexcept;
    void swap(inplace_stop_token&) noexcept;
  private:
    const inplace_stop_source* stop_source_ = nullptr; // solo para exposición
  };
}

Plantilla de clase std::inplace_stop_source

namespace std {
  class inplace_stop_source {
    // constructores, asignaciones y destructor
    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();
    // manejo de parada
    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;
  };
}

Plantilla de clase std::inplace_stop_callback

namespace std {
  template<class CallbackFn>
  class inplace_stop_callback {
  public:
    using callback_type = CallbackFn;
    // constructores y destructor
    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_;      // solo para exposición
  };
  template<class CallbackFn>
  inplace_stop_callback(inplace_stop_token, CallbackFn) 
    -> inplace_stop_callback<CallbackFn>;
}