Multithreading 线和纤维有什么区别?

Multithreading 线和纤维有什么区别?,multithreading,coroutine,fiber,Multithreading,Coroutine,Fiber,线和纤维有什么区别?我听说过ruby中的光纤,也听说它们有其他语言版本,有人能简单地向我解释一下线程和光纤的区别吗。在Win32中,光纤是一种用户管理的线程。光纤有自己的堆栈和指令指针等,但操作系统不安排光纤:必须显式调用SwitchToFiber。相反,线程是由操作系统预先调度的。因此,粗略地说,光纤是在应用程序/运行时级别管理的线程,而不是真正的OS线程 结果是光纤更便宜,应用程序对调度有更多的控制。如果应用程序创建了大量并发任务,并且/或者希望在运行时进行密切优化,那么这一点非常重要。例如

线和纤维有什么区别?我听说过ruby中的光纤,也听说它们有其他语言版本,有人能简单地向我解释一下线程和光纤的区别吗。

在Win32中,光纤是一种用户管理的线程。光纤有自己的堆栈和指令指针等,但操作系统不安排光纤:必须显式调用SwitchToFiber。相反,线程是由操作系统预先调度的。因此,粗略地说,光纤是在应用程序/运行时级别管理的线程,而不是真正的OS线程

结果是光纤更便宜,应用程序对调度有更多的控制。如果应用程序创建了大量并发任务,并且/或者希望在运行时进行密切优化,那么这一点非常重要。例如,数据库服务器可能选择使用光纤而不是线程


(同一术语可能有其他用法;如前所述,这是Win32定义。)

线程由操作系统调度(先发制人)。操作系统可以随时停止或恢复线程,但光纤或多或少会自行管理(合作)并相互让步。也就是说,程序员控制光纤何时进行处理,以及该处理何时切换到另一光纤。

线程通常依赖内核中断线程,以便它或另一个线程可以运行(这更好地称为先发制人多任务处理)而光纤则使用协作式多任务处理,即光纤本身放弃其运行时间,以便其他光纤能够运行

一些有用的链接比我可能做的更好地解释了它:


    • 线程使用先发制人的调度,而光纤使用协作的调度

      有了一个线程,控制流可以随时中断,而另一个线程可以接管。使用多个处理器,可以同时运行多个线程(同步多线程,或SMT)。因此,您必须非常小心并发数据访问,并使用互斥体、信号量、条件变量等保护数据。要做到正确,通常是非常棘手的

      对于光纤,控制仅在您告诉它时切换,通常使用名为
      yield()
      的函数调用。这使得并发数据访问更容易,因为您不必担心数据结构或互斥体的原子性。只要您不让步,就不会有被抢占的危险,也不会有另一根光纤试图读取或修改您正在处理的数据。但是,如果您的光纤进入无限循环,则没有其他光纤可以运行,因为您没有屈服


      您还可以混合使用线程和光纤,这会导致两者都面临的问题。不建议这样做,但如果仔细执行,有时可能是正确的做法。

      线程最初是作为轻量级进程创建的。以类似的方式,纤维是一种轻量级的线,通过屈服控制(简单地)依靠纤维本身来彼此调度


      我想下一步是,每当你想让他们执行一条指令时,你必须向他们发送一个信号(和我的5岁儿子一样:-)。在过去(甚至现在在一些嵌入式平台上),所有线程都是光纤,没有先发制人,您必须编写线程才能正常工作。

      最简单的说法是,线程通常被认为是先发制人的(尽管这可能并不总是正确的,具体取决于操作系统)而纤维则被认为是重量轻、相互配合的线。两者都是应用程序的独立执行路径

      对于线程:当前执行路径可能随时被中断或抢占(注意:此语句是一个泛化语句,根据OS/threading package/等的不同,可能并不总是正确的)。这意味着对于线程而言,数据完整性是一个大问题,因为一个线程可以在更新数据块的中间停止,从而使数据的完整性处于不完整或不完整的状态。这也意味着操作系统可以利用多个CPU和CPU核,同时运行多个线程,并让开发人员负责保护数据访问


      对于光纤:当前执行路径仅在光纤产生执行时中断(如上所述)。这意味着光纤总是在定义明确的位置启动和停止,因此数据完整性问题要小得多。此外,由于光纤通常在用户空间中进行管理,因此无需进行昂贵的上下文切换和CPU状态更改,从而使从一根光纤到下一根光纤的更改非常高效。另一方面,由于没有两条光纤可以完全同时运行,因此仅使用光纤无法利用多个CPU或多个CPU核。

      请注意,除了线程和光纤之外,Windows 7还引入了:

      用户模式调度(UMS)是一种 轻量机构 应用程序可以使用来计划其 自己的线程。应用程序可以切换 用户模式下的UMS线程之间 不涉及系统调度器 并在必要时重新控制处理器 UMS线程在内核中阻塞。嗯 线与纤维的不同之处在于 每个UMS线程都有自己的线程 上下文而不是共享线程 单个线程的上下文。这个 能够在中的线程之间切换 用户模式使UMS更加高效 比线程池更适合管理大型 短期工作项目的数量 这需要很少的系统调用


      有关线程、光纤和UMS的更多信息,请观看。

      首先,我建议您阅读本说明作为背景资料

      一旦你读到这篇文章,它就相当直截了当了