纯C++设计模式非阻塞for循环

lztngnrs  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(110)

我试着阅读我的问题,但甚至找不到合适的词来谷歌它。
假设我在纯C++中有一个这样的函数(将在ESP32上运行,没有线程):

void do_something_for_a_long_time(vector a) {
  for(int i=0; i < 1000; i++) {
    for(int j=0; j < 1000; j++) {
      if(a.start == a.end) {
        //go deeper
        do_something_for_a_long_time(a[1]);
      } else {
        //end of recursion
        //do something with vector
      }
    }
  }
}

字符串
这个问题有点复杂,但主要任务就像上面的代码一样。我在循环和递归中计算了一些东西。我必须使用纯C++,没有线程,因为它将在Arduino上运行。
什么是一个好的设计模式来解决这样的问题,以便能够获得非阻塞计算:

loop() {
  //call this often
  do_something_non_blocking(...);
  //other stuff
}


我的意思是,如果非阻塞函数被调用,我想做一个下一步,并且会非常频繁地调用该函数,而不是只调用一次就得到结果(并阻塞所有东西)。我可以创建一些复杂的状态机,但希望找到一个通用的干净的解决方案。
想法:

  • 分割成循环
  • init
  • 身体
  • 出口
  • 写一个宏库来封装状态机中的代码
d5vmydt9

d5vmydt91#

你要找的一般概念是coroutines或 * 合作多任务 *。
其思想是函数可以被挂起和恢复,以便多个活动可以在单个线程上交错。
它是“合作的”,因为函数需要显式地产生(例如co_yieldco_await),而不是像线程那样被调度器抢占。
你总是可以编写某种类型的状态机来手动完成这一点,就像我们在拥有具有一流语言支持的类集之前可以编写手动存储其状态的仿函数类一样。
注意:对于你的特定用例,状态机需要以某种方式将你的搜索空间分成离散的块(可接受的持续时间),然后每个“步骤”只处理一个块。如果你能做到这一点,即使你没有时间找到最好的移动,你也能得到一个相当好的结果,那就更好了。

qjp7pelc

qjp7pelc2#

你可以做一些类似于this的事情,它以一种创造性的(老实说是可怕的)方式利用C switch语句来实现协同例程,在这种情况下,他使用静态变量,这通常可能不是一个好主意,但我认为它也适用于你的用例。

相关问题