gpt4 book ai didi

c++ - 使用线程以定时间隔调用函数

转载 作者:行者123 更新时间:2023-11-28 02:39:03 32 4
gpt4 key购买 nike

我正在构建一个模拟器来测试一个非常简单的机器人的学生代码。我需要定期在不同的线程上运行两个函数(更新机器人传感器和机器人位置)。我当前的实现是处理器效率非常低的,因为它有一个线程专门用于简单地递增数字以跟踪代码中的位置。我最近的理论是我可以使用 sleep 来给出传感器更新值和机器人位置之间的时间延迟。我的第一个问题是:这有效吗?第二:除了测量时钟周期而不是秒之外,有什么方法可以做一件简单的事情吗?

最佳答案

通过等待类似互斥锁的对象让线程进入休眠状态通常是有效的。一个常见的模式涉及等待一个超时的互斥体。当达到超时时间时,间隔时间到。当互斥锁被释放时,是线程终止的信号。

伪代码:

void threadMethod() {
for(;;) {
bool signalled = this->mutex.wait(1000);
if(signalled) {
break; // Signalled, owners wants us to terminate
}

// Timeout, meaning our wait time is up
doPeriodicAction();
}
}

void start() {
this->mutex.enter();
this->thread.start(threadMethod);
}

void stop() {
this->mutex.leave();
this->thread.join();
}

在 Windows 系统上,超时通常以毫秒为单位指定,并且精确到大约在 16 毫秒以内(timeBeginPeriod() 可能能够改进这一点)。我不知道 CPU 周期触发的同步原语。有称为“关键部分”的轻量级互斥量,它们在委托(delegate)给 OS 线程调度程序之前使 CPU 旋转几千个周期。在这段时间内,它们相当准确。

在 Linux 系统上,精度可能会更高一些(高频定时器或 tickless 内核),并且除了互斥体之外,还有类似于 Windows 临界区的“futexes”(快速互斥体)。


我不确定我是否理解了您要实现的目标,但如果您想测试学生代码,您可能需要使用虚拟时钟并自行控制时间的流逝。例如,通过调用学生必须提供的 processInputs()decideMovements() 方法。每次调用后,有 1 个时隙可用。

关于c++ - 使用线程以定时间隔调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26593839/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com