暂停和恢复 C++ 函数

Pause and resume a c++ function

我在编程方面遇到了一个问题,我没有找到任何方便快捷的执行解决方案。

我正在尝试实现某种状态机:在条目中获取一个字节,对其进行处理,更改状态,循环等...目的是处理字节流而不需要任何内存缓冲区(处理字节每字节)。

class 应该如下所示:

class Decoder {
  void next() {
    int i = 0;
    std::cout << i << "\n";
    i++;
    yield(); // pseudo code => should stop the function and save the current state (or simply not freeing allocated variables)
    std::cout << i << "\n";
  }
};

Decoder decoder = Decoder();
decoder.next(); // print 1
std::cout << "1.5" << "\n"; // print 1.5
decoder.next(); // print 2

一个解决方案可能是创建一个 step 属性 来保存该步骤,然后通过切换继续,但性能会受到很大影响。我想知道是否有办法退出函数的执行,然后再继续执行?

明确一点,我不想暂停整个程序,只是暂停一个功能。暂停这样的函数将 return 到调用者并继续执行程序直到调用下一个 next

此外,我想尽量避免线程和标准(我更喜欢所有环境代码)。最后,如果您对我的问题有任何其他替代方案:有效处理内存字节流,我愿意接受您的建议。

感谢您的帮助。

我相信您可以通过以下两种方式实现这一目标:

选项 1:会员国

将状态机对象拆分为一个单独的对象,并将所有局部变量转换为成员。

对于每个步骤,保存一个 State 成员,表示您在整个程序执行过程中现在的位置。

每次您输入时 next() 对照开关检查您的状态并为该步骤调用指定的内部方法。

每个这样的步骤方法模拟连续 yields.

之间的代码执行
struct Decoder {
  void next() {
    switch (_step) {
      case s1:
        step1();
        _step = s2;
        return;

      case s2:
        step2();
        _step = s1;
        return;

      default:
        return; // handle error...
    }
  }

private:
  enum Step { s1, s2 };

  Step _step = s1;
  int _i = 1;

  void step1() {
    std::cout << _i << "\n";
    _i++;
  }

  void step2() {
    std::cout << _i << "\n";
  }
};

int main() {
  Decoder decoder = Decoder();
  decoder.next(); // print 1
  std::cout << "1.5" << "\n"; // print 1.5
  decoder.next(); // print 2
}

选项 2:线程和信令

使用线程,您当然可以 运行 使用本机 API(例如 pthread_create 在 POSIX 平台上)。

在你的线程中,每次你想要 yield,等待一个条件变量,例如:

struct Decoder {
  Decoder() {
    _thread = std::thread { &Decoder::worker, this };
  }

  ~Decoder() {
    _thread.join();
  }

  void next() {
    std::lock_guard<std::mutex> lock(_mutex);
    _work = true;
  }

private:
  void wait() {
    std::unique_lock<std::mutex> lock(_mutex);
    _cond.wait(lock, [this](){return _work;});
  }

  void worker() {
    wait();

    int i = 0;
    std::cout << i << "\n";
    i++;

    wait();

    std::cout << i << "\n";  
  }

  std::thread _thread;
  std::mutex _mutex;
  std::condition_variable _cond;
  bool _work = false;
};

int main() {
  Decoder decoder;
  decoder.next(); // print 1
  std::cout << "1.5" << "\n"; // print 1.5
  decoder.next(); // print 2
}