暂停和恢复 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
}
我在编程方面遇到了一个问题,我没有找到任何方便快捷的执行解决方案。
我正在尝试实现某种状态机:在条目中获取一个字节,对其进行处理,更改状态,循环等...目的是处理字节流而不需要任何内存缓冲区(处理字节每字节)。
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
}