【问题标题】:Why should I use coroutine in C/C++为什么要在 C/C++ 中使用协程
【发布时间】:2018-10-27 06:06:00
【问题描述】:

此图来自Practical usage of setjmp and longjmp in C

据我了解,coroutine 是两个进程,看起来像是为 human 并行执行,但实际上为 machine 执行单个进程。

但是使用setjmp & longjmp 感觉代码很难读。如果需要写一样的。例如进程 A 和 B,我会给进程提供 serval 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;
    ...

我需要一个理由来支持我在 C/C++ 中使用 setjmp & longjmp & coroutine。 有什么优势?

【问题讨论】:

  • 你根本不需要这样做!
  • @bipll 如果它看起来没那么有用,人们为什么要创建它?什么样的应用程序使用它?

标签: coroutine c++-coroutine


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2016-09-06
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多