百科问答小站 logo
百科问答小站 font logo



有了线程,为什么还要有协程? 第1页

  

user avatar   pansz 网友的相关建议: 
      

首先解释:协程是非抢占式多任务,线程是抢占式多任务。

协程需要编写代码者主动让出控制权,而线程可以无需规划让出控制权的时间点。

协程哪怕没有操作系统干预也可以实现,毕竟任何编程语言自身就能够实现这个结构。早期的多任务大多来自于此。所以协程肯定是早于线程出现的。

最初,抢占式多任务的发明是一个feature,不需要考虑程序在何处被插入,就可以自动的实现多任务。很多人觉得这很方便。

然而后来,线程的弊端慢慢显现,一方面是程序不知道在什么时间点会被抢走焦点因此无法更有效的规划数据访问,二方面是线程需要有额外开销,有大量并行任务时不适合使用线程,例如C10K问题需要在短时间内响应一万个请求,而当时的系统尚不能有效处理一万个线程。

于是,协程重新回到了程序员的视线。因为一方面,协程代码中所有让出控制权的结点都是已知的,不会存在多线程同步方面的相关问题。二方面,协程的开销非常小,成千上万个协程并发也完全没问题。




  

相关话题

  在同一个进程中,能否在一个线程用一个epoll大循环管理多个UdpServer+TcpServer? 
  C++ 中,std::atomic 是真正的「原子」吗? 
  C++20 即将到来的 coroutine 能否与 Golang 的 goroutine 媲美? 
  在同一个进程中,能否在一个线程用一个epoll大循环管理多个UdpServer+TcpServer? 
  go mutex阻塞线程吗,如果不阻塞,为什么呢? 
  C# 如何在调用控件时做到 Thread-safe(线程安全)? 
  semaphore和mutex的区别? 
  c#中虽然异步和多线程是两码事,但是是否异步微软提供的async函数内部还是多线程去实现的? 
  go mutex阻塞线程吗,如果不阻塞,为什么呢? 
  c#中虽然异步和多线程是两码事,但是是否异步微软提供的async函数内部还是多线程去实现的? 

前一个讨论
为什么二代身份证如此重要的物件,丢失后无法挂失身份证号,公安部当初设计时就想不到吗?
下一个讨论
即将毕业,从事C++开发,笔记本推荐?





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利