C++ std::this_thread::sleep_until() 函数

2025年3月21日 | 阅读 4 分钟

在 C++ 中,'std::this_thread::sleep_until' 函数'<thread>' 库的一部分,它提供了一种机制来暂停当前线程的执行,直到达到特定的时间点。与它的对应函数 std::this_thread::sleep_for 不同,后者会暂停线程一段指定的时间,而 sleep_until 旨在使线程等待到给定的未来时间,通常使用 std::chrono::time_point 对象表示。这使得开发人员能够在多线程应用程序中创建高度精确的基于时间的执行流。

该函数接受一个 'std::chrono::time_point',它本质上是使用时钟(例如 'std::chrono::system_clock' 或 'std::chrono::steady_clock')生成的时间戳。这个时间点表示线程应该恢复执行的确切时刻。这种对线程何时唤醒进行细粒度控制的能力在实时系统、调度、事件驱动编程或需要精确触发操作的时间敏感操作等场景中非常有用。

该函数会阻塞当前线程,直到达到或超过指定时间。如果提供的时间点已经过去,该函数将立即返回而不会有任何延迟。此功能确保线程不会在错过其目标唤醒时间时不必要地暂停。

一个主要用例是开发需要定时轮询或计划任务的系统,例如周期性更新、计时器或出于同步目的延迟线程执行。此外,通过使用 'std::chrono',开发人员可以根据底层系统时钟的精度,将计时分辨率从秒自定义到微秒甚至纳秒。总的来说,'sleep_until' 提供了一种精确而灵活的方式来管理线程与时间相关的行为。

程序

让我们举一个例子来说明 C++ 中的 std::this_thread::sleep_until 函数。

输出

 
Tasks are scheduled to execute after 3, 6, and 9 seconds.
Task: Task 1 executed at 1727172960 seconds since epoch.
Task: Task 2 executed at 1727172963 seconds since epoch.
Task: Task 3 executed at 1727172966 seconds since epoch.
All tasks have completed!   

说明

  • 任务函数: 任务名称和计划执行时间被发送到 scheduled_task 函数。它使用 std::this_thread::sleep_until 暂停执行,直到指定时间点。当线程恢复时,它会检索当前时间,计算与计划时间的秒数差,并与任务名称一起显示此信息。
  • 主函数: 任务及其各自的执行时间存储在由对组成的向量中,其中每对包含任务名称及其计划时间。在获取当前时间后,分别在 3、6 和 9 秒后安排三个作业运行。
  • 任务执行: 应用程序打印一条通知,说明任务已安排。随后,它遍历任务向量,为每个任务调用 scheduled_task,导致每个任务在同一线程上并行运行。
  • 完成消息: 在每个任务完成后,最终消息确认所有任务都已执行。

复杂度分析

时间复杂度

scheduled_task 函数的 sleep 操作主要负责给定 C++ 代码的时间复杂度。由于每个作业都睡眠三秒、六秒和九秒,因此总时间复杂度为 O(T),其中 T 是所有睡眠操作所需的总时间。在算法分析中,它被视为 O(1) 表示常数时间复杂度。然而,它转换为 (3 + 6 + 9) = ?(18) O(3+6+9)=O(18)。

空间复杂度

空间复杂度为 O(N),其中 N 是计划作业的数量。软件将作业及其执行时间存储在向量中,该向量占用的空间与任务数量成正比。程序使用额外的变量,这些变量占用常数空间并贡献 O(1)。