取消精确睡眠
Accurate Sleep with cancellation
我需要实现准确且一致的延迟或睡眠功能,,必须能够取消。
这是我的代码:
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秒,其他PC显示16秒。
有关Sleep((函数的文章说它与Windows中断绑定到Windows中断。上面的功能可能会遇到由于重新安排和中断延迟而导致的时间误差的传播。
Windows Timestamp Project 描述了在计时器对象上等待的另一种技术。我的理解是,该技术无法提供取消手段(通过另一个主题,线程(。
问题:
1.如何改善线程延迟或睡眠的实现,这可以被另一个任务取消,并且更一致?
可以终止睡眠的AFX线程吗?
(当主线程终止睡眠AFX线程时会发生什么?(当主线程终止称为waitforsingleobject的线程时,会发生什么?
准确性应大约为10ms,如10秒 10ms。
结果应在各种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_for
和wait_until
(与wait
相同,但总等待时间限制(以及notify_one
和notify_all
方法来唤醒睡眠的方法线程(一个或全部(,让他们检查觉醒状况并继续执行任务。
参考中查看std::conditional_variable
。只需谷歌搜索它,您就会找到足够的信息。
如果您由于某种原因不信任std::conditional_variable
实施,您仍然可以将其用于迷你等待和觉醒。
-
我如何改善线程延迟或睡眠的实现, 可以被另一个任务取消,并且更一致?
- 以前在这里讨论过高精度的睡眠。我使用了类似于此处描述的等待计时器方法。
-
可以终止睡觉的AFX线程吗?(当主时会发生什么 线程终止睡觉的AFX线程?(
- 我认为您是指用
TerminateThread
终止?AFX线程只是围绕标准Windows线程的包装器。他们没有什么特别的或神奇的,可以区分他们的行为。所以会发生的是一堆坏事:- 如果目标线程拥有关键部分,则关键部分将不会发布。
- 如果目标线程正在从堆中分配内存,则不会释放堆锁。
- 如果目标线程终止时执行某些内核32调用,则该线程过程的kernel32状态可能不一致。
- 如果目标线程正在操纵共享DLL的全局状态,则可以破坏DLL的状态,从而影响DLL的其他用户。
- 如果您可以访问应用程序的所有源代码,则不必这样做。
- 我认为您是指用
-
主线程终止已调用的线程时会发生什么
WaitForSingleObject
?- 请参阅上一个子弹。
CreateEvent
和WaitForSingleObject
实际上是终止线程的推荐方法。
- 请参阅上一个子弹。
- 挂起和取消挂起一个文件DLL
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 如何在Qt中取消捕获字符串
- 如何使用 TStyleManager::UnRegisterStyle() 取消注册样式
- GLEW/GLUT:调用init并创建一个窗口后,取消初始化并重新初始化?
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- C++宏定义和取消定义
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 提升 asio 并发计时器取消问题与链
- 取消引用指向整数的指针时获得不同的结果
- tbb::p arallel_for_each 在取消时未执行
- 在清除 istream 之前,我不应该需要取消获取它吗?