此图片来自Practical usage of setjmp and longjmp in C。
根据我的理解,coroutine
是两个过程看起来像是为人类并行执行,但实际上为机器执行了一个过程。
但是使用setjmp
& longjmp
我觉得很难阅读代码。如果需要写同一个。例如,过程A& B,我会给进程提供serage States
,将它们分成不同的部分(状态),
按顺序执行:
Process A
switch (state)
case A1:
if (A1 is done)
do B1
break;
...
Process B
switch (state)
case B1:
if (B1 is done)
do A2
break;
...
我需要一个理由支持我使用setjmp
& longjmp
& C / C ++中的coroutine
。
有什么优势?
答案 0 :(得分:0)
setjmp/longjmp()
很少被现在的程序员使用。相反,你应该使用更强大的boost :: coroutine或我的QtNetworkNg。协同程序广泛使用,主要用于网络编程。
我是QtNetworkNg的作者,它提供了一个堆栈协程实现。在QtNetworkNg的文档中,我写道:
传统的网络编程使用线程。 send()/ recv()被阻止,然后操作系统将当前线程切换到另一个就绪线程,直到数据到达。这非常简单,易于网络编程。但是线程使用大量资源,成千上万的连接可能消耗很多内存。更糟糕的是,线程会导致数据争用,数据中断甚至崩溃。
基于协程的范例是网络编程的现在和特征。 Coroutine是轻量级线程,它有自己的堆栈,不是由操作系统管理,而是由QtNetworkNg管理。与基于线程的范例一样,send()/ recv()被阻止,但切换到同一线程unitl数据到达的另一个协同程序。许多协同程序可以低成本创建。因为只有一个线程,所以不需要锁或其他同步。 API像基于线程的范例一样简单,但避免使用线程的复杂性。
除此之外,协同程序可以更干净地处理状态机和时间线。一些在线游戏服务器使用协同程序来处理数千个同行之间的交互。