C++20 中的 头文件

17 Mar 2025 | 4 分钟阅读

这个 <stop_token> 头文件是在 C++20 中引入的。它提供了取消异步操作的高效机制。它提供了使用异常进行取消技术更直接和不同的方法。这个头文件是线程支持库的一部分。

什么是头文件?

头文件是一组指令,指定特定模块或数据的结构和功能。它包含变量、函数、类等的声明。它们用于防止由于不完整定义而导致的错误。

什么是异步操作?

异步操作允许计算机程序执行任务,而无需等待每个任务完成再继续下一个任务。它对于同时处理多个任务非常有用。例如,给你的朋友发送消息。你无需等待回复才能做其他事情,你可以继续使用你的手机,比如玩游戏或浏览。同时,消息正在后台发送并等待回复。

stop_token 头文件中存在的类

它包含两个主要类:stop_sourcestop_token 类。

  • "stop_source"

这个类表示取消请求的来源。它提供了请求取消和检查是否已请求取消的方法。

  • "stop_token"

这个类表示 stop_source 的一个 “视图”。它允许检查是否已请求取消。它检查是否有必要发出取消请求。

什么是 "stop_source"?

它用于创建停止令牌的源。它与 stop_token 协同工作。它用于管理异步操作的生命周期。

stop_source 类的语法

它具有以下语法:

这里,创建了一个名为 myStopSourcestop_source 类对象。get_token() 函数生成一个名为 mystopToken() 的 stop_token。这个停止令牌用于检查和停止请求。

示例

让我们用一个程序来演示 C++ 中的 stop_source 类。

输出

<stop_token> Header in C++20

说明

在这个程序中,我们试图通过向前移动来控制玩具车,并在移动一段时间后停止它。我们可以在需要时停止玩具车。moveToyCar 函数将表示玩具车的移动动作。我们创建了一个名为 myStopSource 的 stop_source 对象,作为停止令牌的控制器。之后,我们使用 myStopSource.get_token() 生成一个相应的停止令牌 "st"。接下来,创建了一个名为 toyCarThreadjthread,它在让玩具车移动 5 秒后,用停止令牌执行 moveToyCar 函数。我们通过调用 myStopSource.request_stop() 请求玩具车停止。程序使用 toyCarThread.join() 等待玩具车线程完成。

什么是 "stop_token"?

stop_token 类通常与 jthread 或其他异步操作结合使用,以实现取消请求的检测。

stop_token 类的语法

它具有以下语法:

此语法将包含对象、变量和函数

对象

  • 类型为 jthreadmyThread 表示执行线程。
  • 类型为 stop_tokenStoken 表示停止令牌。

函数

  • asyncOperation() 函数表示在单独线程中执行的异步操作。
  • request_stop() 函数用于请求停止线程。
  • join() 函数用于等待关联的线程。

示例

让我们用一个程序来演示 C++ 中的 stop_token

输出

<stop_token> Header in C++20

说明

这个程序表示一个夜灯,它会一直 开着,直到我们决定 关掉 它。"nightlamp" 函数在一个单独的线程 "jthread" 中运行,并检查停止令牌以查看是否应该 关掉。主线程等待 5 秒,然后通过在 jthread 上使用 request_stop() 请求夜灯关闭。

结论

总之,C++20 中的 <stop_token> 头文件引入了取消异步操作的高效机制,提供了更直接的取消方法。该头文件包含重要的类,如 stop_sourcestop_token。这些类促进了协作取消,允许程序响应停止请求,并增强了异步任务的鲁棒性和控制。