暂停并恢复c ++函数

时间:2017-10-08 09:37:07

标签: c++ resume pause

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

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

该课程应如下所示:

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属性来保存步骤,然后通过切换恢复,但性能会受到很大影响。我想知道是否有办法退出函数的执行,然后再恢复它?

要清楚,我不想暂停整个程序,只需要一个功能。暂停这样的函数将返回调用者并继续执行该程序,直到调用下一个next

此外,我想避免使用thread和std(我更喜欢所有的环境代码)。最后,如果您对我的问题有任何其他选择:有效处理内存的字节流,我可以接受您的建议。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我相信你可以用这两种方式实现这一目标:

选项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运行(例如POSIX平台上的pthread_create)。

在你的线程中,每次你想要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
}