线程和纤程有什么不同?我听说过ruby中的纤程,听说它们在其他语言中也可用,有人能简单地给我解释一下线程和纤程的区别吗?
发布于 2009-04-28 04:40:20
在最简单的术语中,线程通常被认为是抢占式的(尽管根据操作系统的不同,这可能并不总是正确的),而纤程则被认为是轻量级的协作线程。这两个都是应用程序的单独执行路径。
使用线程:当前执行路径可能在任何时候被中断或抢占(注意:此语句是一个泛化语句,根据操作系统/线程包/等的不同,可能并不总是正确的)。这意味着对于线程来说,数据完整性是一个大问题,因为一个线程可能会在更新数据块的过程中停止,从而使数据的完整性处于不好或不完整的状态。这也意味着操作系统可以通过同时运行多个线程并让开发人员保护数据访问来利用多个CPU和CPU核心。
使用纤程:只有当纤程产生执行时,当前执行路径才会中断(如上所述)。这意味着纤程总是在定义明确的位置开始和停止,因此数据完整性不是什么问题。而且,因为纤程通常在用户空间中管理,所以不需要进行昂贵的上下文切换和CPU状态改变,从而使得从一个纤程到下一个纤程的改变非常有效。另一方面,由于没有两个纤程可以完全同时运行,因此仅使用纤程不能利用多个CPU或多个CPU核心。
发布于 2009-04-28 04:38:11
线程使用抢占式调度,而纤程使用协作调度。
使用线程,控制流可能在任何时候被中断,而另一个线程可以接管。使用多个处理器,您可以让多个线程同时运行(同步多线程或SMT)。因此,您必须非常小心并发数据访问,并使用互斥锁、信号量、条件变量等保护数据。这通常是非常棘手的正确做法。
对于纤程,控制只在您告诉它时进行切换,通常使用名为yield()之类的函数调用。这使得并发数据访问变得更容易,因为您不必担心数据结构或互斥锁的原子性。只要你不让步,就不会有被抢占的危险,也不会有另一根光纤试图读取或修改你正在处理的数据的危险。因此,如果你的光纤进入无限循环,其他光纤就不能运行,因为你不会让步。
您还可以混合线程和纤程,这会引起两者都面临的问题。不建议这样做,但如果仔细操作,有时可能是正确的做法。
发布于 2009-04-28 04:35:44
在Win32中,纤程是一种用户管理的线程。纤程有自己的堆栈和指令指针等,但是纤程不是由操作系统调度的:您必须显式调用SwitchToFiber。相比之下,线程是由操作系统抢先调度的。因此,粗略地说,纤程是在应用程序/运行时级别管理的线程,而不是真正的OS线程。
其结果是光纤更便宜,并且应用程序对调度有更多的控制。如果应用程序创建了许多并发任务,并且/或者希望在它们运行时进行紧密优化,这一点可能很重要。例如,数据库服务器可能选择使用纤程而不是线程。
(同一术语可能还有其他用法;如前所述,这是Win32的定义。)
https://stackoverflow.com/questions/796217
复制相似问题