线和光纤有什么区别?
线和光纤有什么区别? 我听说过红宝石光纤,我听说他们有其他语言可用,有人可以简单地向我解释线程和光纤之间的区别。
用最简单的话来说,线程通常被认为是抢占式的(尽管这可能并非总是如此,这取决于操作系统),而光纤被认为是轻量级的合作线程。 两者都是您的应用程序的独立执行路径。
使用线程:当前的执行路径可能随时被中断或抢占(注意:这个语句是泛化的,根据OS /线程包等可能不总是成立)。 这意味着对于线程来说,数据完整性是一个大问题,因为在更新大块数据的过程中可能会停止一个线程,从而导致数据的完整性处于不良或不完整状态。 这也意味着操作系统可以通过同时运行多个线程并利用多个CPU和CPU内核来让开发人员保护数据访问。
对于光纤:当光纤执行完成时,当前执行路径才会中断(与上面相同)。 这意味着光纤始终在明确定义的位置开始和停止,因此数据完整性更不是问题。 而且,由于光纤通常在用户空间中进行管理,因此无需进行昂贵的上下文切换和CPU状态更改,从一根光纤切换到另一根光纤效率极高。 另一方面,由于没有两条光纤可以完全同时运行,因此仅使用光纤就不会利用多个CPU或多个CPU内核。
在Win32中,光纤是一种用户管理的线程。 光纤有自己的堆栈和自己的指令指针等,但光纤不是由OS安排的:你必须明确地调用SwitchToFiber。 相反,线程是由操作系统预先安排的。 所以粗略地说,光纤是一个在应用程序/运行时级别管理的线程,而不是一个真正的操作系统线程。
结果是光纤更便宜,并且应用程序对调度有更多的控制权。 如果应用程序创建大量并发任务,并且/或者想在运行时进行紧密优化,这可能很重要。 例如,数据库服务器可能会选择使用光纤而不是线程。
(可能还有其他用法,如同上所述,这是Win32定义。)
线程使用先占调度,而光纤使用协作调度。
使用线程时,控制流可能会随时中断,而另一个线程可能会接管。 使用多个处理器,您可以同时运行多个线程(同时多线程或SMT)。 因此,您必须非常小心并发数据访问,并使用互斥锁,信号量,条件变量等来保护您的数据。 正确的做法往往非常棘手。
使用光纤时,只有当您告诉它时,控件才会切换,通常使用名为yield()
的函数调用。 这使得并发数据访问更容易,因为您不必担心数据结构或互斥体的原子性。 只要你不屈服,就没有被抢占的危险,并且有另一种光纤试图读取或修改你正在使用的数据。 结果,尽管如果你的光纤进入无限循环,没有其他光纤可以运行,因为你没有屈服。
您还可以混合线程和纤维,这会导致两者都面临的问题。 不推荐,但如果仔细做好,有时候是正确的。
链接地址: http://www.djcxy.com/p/55257.html