std::stop_callback

来自cppreference.com
< cpp‎ | thread
 
 
并发支持库
线程
(C++11)
(C++20)
(C++20)
stop_callback
(C++20)
this_thread 命名空间
(C++11)
(C++11)
(C++11)
互斥
(C++11)
(C++11)  
通用锁管理
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
条件变量
(C++11)
信号量
闩与屏障
(C++20)
(C++20)
未来体
(C++11)
(C++11)
(C++11)
(C++11)
安全回收
(C++26)
(C++26)
风险指针





原子类型
(C++11)
(C++20)
原子类型的初始化
(C++11)(C++20 中弃用)
(C++11)(C++20 中弃用)
内存定序
原子操作的自由函数
原子标志的自由函数
 
 
在标头 <stop_token> 定义
template< class Callback >
class stop_callback;
(C++20 起)

stop_callback 类模板提供一种为关联的 std::stop_token 对象注册回调函数的 RAII 对象类型,使得当该 std::stop_token 的关联 std::stop_source 被请求停止时将调用这个回调函数。

经由 stop_callback 构造函数注册的回调函数,在成功对该 stop_callback 的关联 std::stop_tokenstd::stop_source 调用了 request_stop() 的同一线程中调用;或者若构造函数的注册前已请求了停止,则在构造此 stop_callback 的线程中调用。

可以对同一 std::stop_token 创建多个 stop_callback,这可以在相同或不同线程同时进行。对它们的执行顺序不提供保证,但它们将被同步调用;但已对 std::stop_token 请求停止后构造的 stop_callback,则如前所述。

若调用的回调经由异常退出,则调用 std::terminate

std::stop_callback可复制构造 (CopyConstructible) 可复制赋值 (CopyAssignable) 可移动构造 (MoveConstructible) 亦非可移动赋值 (MoveAssignable)

模板形参 Callback 类型必须为 invocable 且为 destructible。忽略任何返回值。

成员类型

类型 定义
callback_type Callback

成员函数

构造新的 stop_callback 对象
(公开成员函数)
析构 stop_callback 对象
(公开成员函数)
operator=
[弃置]
stop_callback 不可赋值
(公开成员函数)

推导指引

示例

#include <chrono>
#include <condition_variable>
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
 
using namespace std::chrono_literals;
 
// 使用一个辅助类进行原子 std::cout 流输出。
class Writer
{
    std::ostringstream buffer;
public:
    ~Writer()
    {
        std::cout << buffer.str();
    }
    Writer& operator<<(auto input)
    {
        buffer << input;
        return *this;
    }
};
 
int main()
{
    // 工作线程。
    // 它将等待直至被请求停止。
    std::jthread worker([] (std::stop_token stoken)
    {
        Writer() << "工作线程 id: " << std::this_thread::get_id() << '\n';
        std::mutex mutex;
        std::unique_lock lock(mutex);
        std::condition_variable_any().wait(lock, stoken,
            [&stoken] { return stoken.stop_requested(); });
    });
 
    // 在工作线程上注册停止回调。
    std::stop_callback callback(worker.get_stop_token(), []
    {
        Writer() << "执行了停止回调,线程: "
            << std::this_thread::get_id() << '\n';
    });
 
    // 可以提前销毁 stop_callback 对象以阻止其执行。
    {
        std::stop_callback scoped_callback(worker.get_stop_token(), []
        {
            // 这里不会执行。
            Writer() << "作用域内的停止回调被执行,线程: "
                << std::this_thread::get_id() << '\n';
        });
    }
 
    // 演示由哪个线程何时执行 stop_callback。
    // 定义停止函数。
    auto stopper_func = [&worker]
    {
        if (worker.request_stop())
            Writer() << "执行了停止请求,线程: "
                << std::this_thread::get_id() << '\n';
        else
            Writer() << "未执行停止请求,线程: "
                << std::this_thread::get_id() << '\n';
    };
 
    // 使多个线程竞争以停止工作线程。
    std::jthread stopper1(stopper_func);
    std::jthread stopper2(stopper_func);
    stopper1.join();
    stopper2.join();
 
    // 已经请求停止后,立即执行新的 stop_callback。
    Writer() << "主线程: " << std::this_thread::get_id() << '\n';
    std::stop_callback callback_after_stop(worker.get_stop_token(), []
    {
        Writer() << "执行了停止回调,线程: "
            << std::this_thread::get_id() << '\n';
    });
}

可能的输出:

工作线程 id: 140460265039616
执行了停止回调,线程: 140460256646912
执行了停止请求,线程: 140460256646912
未执行停止请求,线程: 140460248254208
主线程: 140460265043776
执行了停止回调,线程: 140460265043776