我为什么要在C / C ++中使用协程

时间:2018-05-17 04:48:50

标签: coroutine c++-coroutine

enter image description here此图片来自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。 有什么优势?

1 个答案:

答案 0 :(得分:0)

setjmp/longjmp()很少被现在的程序员使用。相反,你应该使用更强大的boost :: coroutine或我的QtNetworkNg。协同程序广泛使用,主要用于网络编程。

我是QtNetworkNg的作者,它提供了一个堆栈协程实现。在QtNetworkNg的文档中,我写道:

  

传统的网络编程使用线程。 send()/ recv()被阻止,然后操作系统将当前线程切换到另一个就绪线程,直到数据到达。这非常简单,易于网络编程。但是线程使用大量资源,成千上万的连接可能消耗很多内存。更糟糕的是,线程会导致数据争用,数据中断甚至崩溃。

     

基于协程的范例是网络编程的现在和特征。 Coroutine是轻量级线程,它有自己的堆栈,不是由操作系统管理,而是由QtNetworkNg管理。与基于线程的范例一样,send()/ recv()被阻止,但切换到同一线程unitl数据到达的另一个协同程序。许多协同程序可以低成本创建。因为只有一个线程,所以不需要锁或其他同步。 API像基于线程的范例一样简单,但避免使用线程的复杂性。

除此之外,协同程序可以更干净地处理状态机和时间线。一些在线游戏服务器使用协同程序来处理数千个同行之间的交互。