命名空间
变体
操作

标准库头文件 <stop_token> (C++20)

来自 cppreference.cn
< cpp‎ | 头文件
 
 
标准库头文件
算法
<algorithm>
<numeric>
字符串
<cctype>
<cstring>
<cuchar> (C++11)
<cwchar>
<cwctype>
<string_view> (C++17)
<string>
文本处理
<clocale>
<codecvt> (C++11/17/26*)
<locale>
<regex> (C++11)
<text_encoding> (C++26)   
数值
<cfenv> (C++11)
<cmath>
<complex>
<linalg> (C++26)
<numbers> (C++20)
<random> (C++11)
<simd> (C++26)
<valarray>
时间
<chrono> (C++11)
<ctime>
C 兼容性
<ccomplex> (C++11/17/20*)
<ciso646> (直到 C++20)
<cstdalign> (C++11/17/20*)
<cstdbool> (C++11/17/20*)
<ctgmath> (C++11/17/20*)
 

此头文件是线程支持库的一部分。

内容

用于查询是否已发出 std::jthread 取消请求的接口
(类) [编辑]
表示停止一个或多个 std::jthread 的请求的类
(类) [编辑]
用于注册 std::jthread 取消时的回调的接口
(类模板) [编辑]
提供停止令牌接口,该接口永远不可能停止或请求停止
(类) [编辑]
引用其关联的 std::inplace_stop_source 对象的停止状态的停止令牌
(类) [编辑]
作为停止状态的唯一所有者的 stoppable-source
(类) [编辑]
用于 std::inplace_stop_token 的停止回调
(类模板) [编辑]

别名模板

获取给定停止令牌类型的回调类型
(别名模板)[编辑]

概念

指定停止令牌的基本接口,该接口允许查询停止请求以及停止请求是否可能
(概念) [编辑]
指定不允许停止的停止令牌
(概念) [编辑]

标签

用于 stop_source 的标签,指示构造时没有关联的停止状态
(标签)[编辑]

[编辑] 概要

namespace std {
  // stop token concepts
  template<class CallbackFn, class Token, class Init = CallbackFn>
    concept /*stoppable-callback-for*/ = /* see description */; // exposition only
 
  template<class Token>
    concept stoppable_token = /* see description */;
 
  template<class Token>
    concept unstoppable_token = /* see description */;
 
  template<class Source>
    concept /*stoppable-source*/ = /* see description */; // exposition only
 
  // class stop_token
  class stop_token;
 
  // class stop_source
  class stop_source;
 
  // no-shared-stop-state indicator
  struct nostopstate_t {
    explicit nostopstate_t() = default;
  };
  inline constexpr nostopstate_t nostopstate{};
 
  // class template stop_callback
  template<class Callback>
  class stop_callback;
 
  // class never_stop_token
  class never_stop_token;
 
  // class inplace_stop_token
  class inplace_stop_token;
 
  // class inplace_stop_source
  class inplace_stop_source;
 
  // class 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>;
}

[编辑] 停止令牌概念

namespace std {
  template<class CallbackFn, class Token, class Init = CallbackFn>
    concept /*stoppable-callback-for*/ =                         // exposition only
      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 only
 
  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; // see implicit expression variations
      } &&
      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 only
      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>;
      };
}

[编辑] std::stop_token

namespace std {
  class stop_token {
  public:
    template<class CallbackFn>
      using callback_type = stop_callback<CallbackFn>;
 
    // constructors, copy, and assignment
    stop_token() noexcept = default;
 
    // member functions
    void swap(stop_token&) noexcept;
 
    // stop handling
    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 only
  };
}

[编辑] std::stop_source

namespace std {
  class stop_source {
  public:
    // constructors, copy, and assignment
    stop_source();
    explicit stop_source(nostopstate_t) noexcept {}
 
    // member functions
    void swap(stop_source&) noexcept;
 
    // stop handling
    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 only
  };
}

[编辑] 类模板 std::stop_callback

namespace std {
  template<class CallbackFn>
  class stop_callback {
  public:
    using callback_type = CallbackFn;
 
    // constructors and 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_;      // exposition only
  };
 
  template<class CallbackFn>
  stop_callback(stop_token, CallbackFn) -> stop_callback<CallbackFn>;
}

[编辑] 类模板 std::never_stop_token

namespace std {
  class never_stop_token {
    struct /*callback-type*/ {       // exposition only
      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;
  };
}

[编辑] 类模板 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;
 
    // member functions
    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 only
  };
}

[编辑] 类模板 std::inplace_stop_source

namespace std {
  class inplace_stop_source {
    // constructors, assignments, and 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();
 
    // stop handling
    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;
  };
}

[编辑] 类模板 std::inplace_stop_callback

namespace std {
  template<class CallbackFn>
  class inplace_stop_callback {
  public:
    using callback_type = CallbackFn;
 
    // constructors and 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_;      // exposition only
  };
 
  template<class CallbackFn>
  inplace_stop_callback(inplace_stop_token, CallbackFn) 
    -> inplace_stop_callback<CallbackFn>;
}