0

0

c++怎么使用std::stop_token停止线程_c++ 20线程安全请求中断【方法】

穿越時空

穿越時空

发布时间:2025-12-31 16:59:32

|

436人浏览过

|

来源于php中文网

原创

不能。std::stop_token 仅提供协作式中断机制,线程需主动轮询或等待该 token 并自行退出;C++20 不支持强制终止线程,必须配合 std::jthread、std::stop_token 和 stop_callback 或轮询 stop_requested() 实现安全中断。

c++怎么使用std::stop_token停止线程_c++ 20线程安全请求中断【方法】

std::stop_token 能否直接终止正在运行的线程?

不能。std::stop_token 本身不终止线程,它只提供一种协作式中断机制:线程需主动轮询或等待该 token,并在收到停止请求后自行退出。C++20 没有提供强制杀线程的接口(如 pthread_cancel 或旧式 std::thread::kill),这是刻意设计的安全约束。

如何用 std::stop_token 实现安全的线程中断?

核心是三件套配合:std::jthread(自动注册 stop_source)、std::stop_token(传入线程函数)、std::stop_callback 或轮询 stop_token.stop_requested()。推荐优先使用 std::jthread,它比 std::thread 更安全、更简洁。

  • std::jthread 构造时自动关联一个 std::stop_source,析构时自动调用 request_stop()(可禁用)
  • 线程函数参数中接收 std::stop_token,用于检查中断状态
  • 避免在循环中无休止忙等;应在可能阻塞点(如 sleep_forwaitread)插入轮询或使用支持 stop_token 的等待函数(如 std::condition_variable::wait 重载)
#include 
#include 
#include 

void worker(std::stop_token stoken) {
    for (int i = 0; i < 10; ++i) {
        if (stoken.stop_requested()) {
            std::cout << "worker: stopping early at " << i << "\n";
            return;
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(200));
        std::cout << "worker: step " << i << "\n";
    }
}

int main() {
    std::jthread t{worker};
    std::this_thread::sleep_for(std::chrono::milliseconds(700));
    t.request_stop(); // 主动触发停止
    // t.join(); // jthread 析构会自动 join,除非已 detach
}

std::stop_token 在条件变量等待中怎么用?

直接传入 std::condition_variable::wait 的重载版本,它会在被唤醒或收到 stop 请求时返回,并通过 stop_token.stop_requested() 判断原因。这是比手动轮询更高效、更及时的中断方式。

  • 必须使用支持 stop_tokenwait 重载(签名含 std::stop_token 参数)
  • 该重载内部会注册临时回调,确保即使等待被虚假唤醒也能响应中断
  • 返回后应先检查 stoken.stop_requested(),再处理条件逻辑,避免漏掉中断信号
#include 
#include 
#include 
#include 

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void waiter(std::stop_token stoken) {
    std::unique_lock lk{mtx};
    // 等待 ready 为 true,或 stop 请求到来
    cv.wait(lk, stoken, []{ return ready; });
    if (stoken.stop_requested()) {
        std::cout << "waiter: interrupted before ready\n";
        return;
    }
    std::cout << "waiter: ready is true\n";
}

常见错误:把 stop_token 当成“取消句柄”滥用

有人试图在线程外反复调用 stop_source.request_stop() 多次,或在已停止的 token 上做无效轮询,这不会报错但毫无意义——stop_requested() 一旦为 true 就永远为 true,且多次 request_stop 是幂等的。真正容易出问题的是:

知了追踪
知了追踪

AI智能信息助手,智能追踪你的兴趣资讯

下载

立即学习C++免费学习笔记(深入)”;

  • 在线程函数中未接收 std::stop_token 参数,导致完全无法响应中断
  • 使用 std::thread 却没手动管理 std::stop_source,造成 token 始终无效
  • 在 long-running 计算循环中不轮询,导致中断延迟数秒甚至更久
  • 误以为 std::jthread::request_stop() 会立即暂停执行——它只是发信号,线程何时响应取决于你代码里哪里检查

协作式中断的关键不在 token 本身,而在于你是否在合理位置埋了检查点。没有检查,token 就是张废纸。

相关专题

更多
登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6041

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

781

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1044

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

1086

2024.03.01

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

989

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

50

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

201

2025.12.29

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

469

2023.08.10

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号