【问题标题】:How do I process two functions in parallel each running at a specific frequency?如何并行处理两个函数,每个函数都以特定频率运行?
【发布时间】:2020-09-09 00:43:58
【问题描述】:

我想并行运行两个函数,每个函数都有不同的执行频率。

我使用了CppTime::Timer,但我意识到,这些函数实际上是在彼此后面执行的。那是因为CppTime 执行了彼此背后的线程,还是我的代码有问题?

这里是脚本:

CppTime::Timer timer;
std::vector<CppTime::timer_id> timer_id;

timer_id.push_back(timer.add(std::chrono::seconds(0), &longProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_slow))));
timer_id.push_back(timer.add(std::chrono::seconds(0), &shortProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_high))));

是否有人知道错误,或者有人有其他解决方案而不是 CppTime?

编辑: 一个进程应该在1Hz 运行(大约需要0.5s)。另一个进程应该在10Hz 运行(只需要几个ms)。不并行运行也没问题,10Hz进程在0.5s之后启动。

【问题讨论】:

  • 多线程不会在完全并行的时间内自动执行代码。即使必须在不同的内核上运行(时钟可能是共享的硬件设备)。问题是您的要求可以接受哪个最小时间间隔?
  • 由于CppTime 显然是您从某处获得或自己编写的某个库,因此包含有关它的额外详细信息非常重要。不要假设这里的任何人以前都使用过这个,或者他们会花时间在互联网上寻找它,只是因为你漏掉了这些信息。
  • @paddy 好像是this implementation
  • 你想通过同时运行两个时间对齐的线程来达到什么目的?
  • 一个简单的控制回路,有高层和低层控制器。

标签: c++ multithreading time


【解决方案1】:

添加计时器回调时,longProcess()shortProcess() 语句将尝试调用这些函数,然后将返回值传递给add()。所以第一个timer.add() 甚至在longProcess() 完成它的工作并退出之后才会被执行。与第二个timer.add()shortProcess() 相同。

假设代码甚至可以编译,假设add() 期望回调与handler_t 的签名匹配,handler_t 的签名定义为std::function&lt;void(timer_id)&gt;,但您调用的是不带任何参数的回调。

将回调函数传递给add()时去掉括号:

void longProcess(CppTime::timer_id)
{
    ...
}

void shortProcess(CppTime::timer_id)
{
    ...
}

...

CppTime::Timer timer;
std::vector<CppTime::timer_id> timer_id;

timer_id.push_back(timer.add(std::chrono::seconds(0), &longProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_slow))));
timer_id.push_back(timer.add(std::chrono::seconds(0), &shortProcess, std::chrono::milliseconds(static_cast<unsigned>(1000.0 / frequency_high))));

话虽如此,看看actual implementationCppTime::Timer 类在内部运行一个工作线程。它将添加的计时器存储在一个排序的向量中,并且只是在一个连续循环中循环通过该向量,在其时间段过去时执行每个处理程序。因此,添加多少计时器并不重要,它们的处理程序将始终相对于彼此按顺序执行。因此,要执行您正在尝试的操作,您需要将处理程序分成多个 CppTime::Timer 实例,以便运行多个线程。

【讨论】:

  • 感谢您的回答。该代码实际上是有效的(但是没有括号是可以的),但是正如您所说,它是按顺序执行的。你知道我必须如何更改它才能并行执行吗?
  • @gab: CppTime 有一个用于计时器的单线程,并且不提供内置的多线程。你必须自己做多线程。创建一个线程池,让定时器在线程池中执行工作,而不是直接在回调中执行。
猜你喜欢
  • 1970-01-01
  • 2015-01-23
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-10
  • 2022-07-14
相关资源
最近更新 更多