zoukankan      html  css  js  c++  java
  • 协程初探

    文章出处:http://blog.csdn.net/lanphaday/archive/2010/03/19/5397038.aspx

        协程,又称微线程和纤程等,据说源于 Simula 和 Modula-2 语言(我没有深究,有错请指正),现代编程语言基本上都有支持,比方 Lua、ruby 和最新的 Google Go,当然也还有近期非常让我惊艳的 falcon。协程是用户空间线程,操作系统对其存在一无所知,所以须要用户自己去做调度,用来运行协作式多任务非常合适。其有用协程来做的东西,用线程或进程通常也是一样能够做的,但往往多了很多加锁和通信的操作。

    以下是生产者消费者模型的基于抢占式多线程编程实现(伪代码):

    由以上代码能够看到线程实现至少有两点硬伤:

    1、对队列的操作须要有显式/隐式(使用线程安全的队列)的加锁操作。

    2、消费者线程还要通过 sleep 把 CPU 资源适时地“谦让”给生产者线程使用,当中的适时是多久,基本上仅仅能静态地使用经验值,效果往往不由人意。

    而使用协程能够比較好的解决问题,以下来看一下基于协程的生产者消费者模型实现(伪代码):

        可以从以上代码看到之前的加锁和谦让 CPU 的硬伤不复存在,但也损失了利用多核 CPU 的能力。所以选择线程还是协程,就要看应用场合了。以下简单谈一下协程常见的用武之地,当中之中的一个是状态机,可以产生更高可读性的代码;还有就是并行的角色模型,这在游戏开发中比較常见;以及产生器,有助于对输入/输出和数据结构的通用遍历。

        协程尽管如此之好,看是非常长时间以来,由于受到基于堆栈的子例程实现的限制,并没有多少语言在事实上语言或库中支持协程,所以线程作为一个替代者(当然,线程也有其超越协程之处)被广泛接受了。可是在今天,非常多语言都内建了协程的支持,甚至是 C/C++ 语言。MS Windows 2000 以后的版本号,都支持所谓的 Fiber,即纤程,事实上就是协程的别称;在开源平台,POSIX 标准也定义了协程相关的标准,GNU Portable Threads 实现了跨平台的用户空间线程,即协程的还有一种别称。在这百花齐放的时节,正是我们好好学习和利用它的时机。

  • 相关阅读:
    Building a Space Station POJ
    Networking POJ
    POJ 1251 Jungle Roads
    CodeForces
    CodeForces
    kuangbin专题 专题一 简单搜索 POJ 1426 Find The Multiple
    The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk's pool
    The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold'em Poker
    The Preliminary Contest for ICPC Asia Xuzhou 2019 E. XKC's basketball team
    robotparser (File Formats) – Python 中文开发手册
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3865861.html
Copyright © 2011-2022 走看看