c++ - 带取消功能的准确 sleep

标签 c++ multithreading windows-7 sleep afx

我需要实现一个准确且一致的延迟或 sleep 功能,并且必须能够被取消

这是我的代码:

bool cancel_flag(false);

void My_Sleep(unsigned int duration)
{
  static const size_t SLEEP_INTERVAL = 10U; // 10 milliseconds
  while ((!cancel_flag) && (duration > SLEEP_INTERVAL))
  {
    Sleep(duration);
    duration -= SLEEP_INTERVAL;
  }
  if ((!cancel_flag) && (duration > 0U))
  {
    Sleep(duration);
  }
}

上述函数是在工作线程中运行的。主线程能够更改“cancel_flag”的值以中止(取消)休眠。

在我的店里,当持续时间为 10 秒(10000 毫秒)时,我们会得到不同的结果。一些 PC 显示 10 秒的 sleep 持续时间,其他 PC 显示 16 秒。

关于 Sleep() 函数的文章说它绑定(bind)到 windows 中断,并且当持续时间过去时,线程被重新安排(可能不会立即运行)。由于重新安排和中断延迟,上述功能可能会遇到时间错误的传播。

Windows Timestamp Project描述了另一种等待计时器对象的技术。我的理解是这种技术不提供取消方法(通过另一个主线程)。

问题:
1. 如何改进我的线程延迟或 sleep 实现,可以被另一个任务取消,并且更一致

  1. 是否可以终止休眠的 AFX 线程?
    (当主线程终止休眠的 AFX 线程时会发生什么?)

  2. 当主线程终止调用 WaitForSingleObject 的线程时会发生什么?

精度应该在 10 毫秒左右,如 10 秒 + 10 毫秒。
结果应该在各种 PC 上保持一致(所有 PC 都运行 Windows 7 或 10)。

背景
具有正确时序的 PC 运行 Windows 7,频率为 2.9 GHz。
时序不正确的 PC 运行的是 Windows 7,频率为 3.1 GHz,同时运行的任务和应用程序较少。
应用程序是使用 Visual Studio 2017 和 MFC 框架(使用 AFX 创建线程)开发的。

最佳答案

你根本不应该实现这个。

在 C++11 中,多线程的所有基本必要实用程序都在标准中实现。 如果您不使用 C++11 - 然后切换到 C++11 或更高版本 - 在不幸的情况下您不能,然后使用 Boost具有相同的特征。

基本上,std::condition_variable 涵盖了您想使用此功能执行的操作。您可以使用函数 wait(它接受离开等待所需的条件函数)、wait_forwait_until(与 wait 相同,但有总等待时间限制)以及 notify_onenotify_all 唤醒休眠线程(一个或所有)并使他们检查觉醒情况并继续他们的任务。

查看引用中的 std::conditional_variable。只需谷歌一下,您就会找到足够的信息和示例。

如果您出于某种原因不信任 std::conditional_variable 实现,您仍然可以将其用于迷你等待和唤醒。

关于c++ - 带取消功能的准确 sleep ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194457/

相关文章:

multithreading - 卡在Rust中的 channel 接收器迭代器上?

c# - 文件关闭问题窗口

java - 如何从 Java 执行完全独立的应用程序。喜欢独立进程

C++ 11通过两种算法之一完成任务

c++ - 异常处理可能出现的问题

c++ - 制作文件 : header including another header C++

windows - 用户级线程内核级线程和纤程

c++ - 开始在 Visual Studio 2013 中使用 clang 3.6.0;如何解决我的 "unknown argument: -ftemplate-depth"编译器错误?

java - 在以下上下文中如何确保线程安全?

vb.net - 应用程序无法在 windows xp 上运行