![]() |
1
133
在最简单的术语中,线程通常被认为是抢先的(尽管这可能并不总是正确的,取决于操作系统),而光纤则被认为是轻量、合作的线程。这两者都是应用程序的单独执行路径。 with threads:当前执行路径可能随时被中断或抢占(注意:此语句是一种泛化语句,根据OS/threading package/etc的不同,可能并不总是保持为true)。这意味着对于线程来说,数据完整性是一个大问题,因为一个线程可能会在更新数据块的过程中停止,从而使数据的完整性处于坏的或不完整的状态。这也意味着操作系统可以利用多个CPU和CPU核心,同时运行多个线程,让开发人员负责保护数据访问。 使用光纤:仅当光纤产生执行时,当前执行路径才会中断(如上所述)。这意味着光纤总是在定义良好的位置启动和停止,因此数据完整性就不再是一个问题。此外,由于光纤通常在用户空间中进行管理,因此不需要进行昂贵的上下文切换和CPU状态更改,从而使从一根光纤到下一根光纤的更改非常有效。另一方面,由于没有两条光纤可以同时运行,因此仅使用光纤不会利用多个CPU或多个CPU核心。 |
![]() |
2
50
线程使用 先发制人的 调度,而光纤使用 合作的 行程安排。 有了线程,控制流随时可能被中断,另一个线程可以接管。使用多个处理器,可以同时运行多个线程( 同时 多线程,或smt)。因此,你必须 非常 小心并发数据访问,并使用互斥锁、信号量、条件变量等保护数据。通常很难纠正。
使用光纤时,控件仅在您告诉它时切换,通常使用名为类似的函数调用
你也可以把线和纤维混在一起,这会导致两者都面临的问题。不建议这样做,但如果小心做,有时是正确的。 |
![]() |
3
42
在Win32中,光纤是一种用户管理的线程。一个光纤有它自己的堆栈和它自己的指令指针等,但是光纤不是由操作系统调度的:您必须显式地调用switchtofiber。相反,线程是由操作系统预先调度的。所以大致来说,光纤是在应用程序/运行时级别管理的线程,而不是真正的操作系统线程。 结果是光纤更便宜,应用程序对调度有更多的控制。如果应用程序创建了大量并发任务,并且/或者希望在运行时进行密切优化,那么这一点很重要。例如,数据库服务器可能选择使用光纤而不是线程。 (同一术语可能还有其他用法;如前所述,这是Win32定义。) |
![]() |
4
35
首先,我建议你读一下 the difference between processes and threads 作为背景材料。 一旦你读到它是非常直接的。线程既可以在内核中实现,也可以在用户空间中实现,或者两者可以混合。光纤基本上是在用户空间中实现的线程。
在现代操作系统的第11.4节“Windows Vista中的进程和线程”中,Tanenbaum评论道:
|
![]() |
5
12
注意,除了线程和光纤之外,Windows7还引入了 User-Mode Scheduling :
有关线程、光纤和UMS的更多信息,请观看 Dave Probert: Inside Windows 7 - User Mode Scheduler (UMS) . |
![]() |
6
7
线程由操作系统调度(先发制人)。操作系统可以随时停止或恢复线程,但光纤或多或少会自我管理(合作)并相互让步。也就是说,程序员控制光纤何时进行处理,何时转换到另一根光纤。 |
![]() |
7
7
线程最初是作为轻量级进程创建的。以类似的方式,纤维是一种轻量级的线,通过产生控制(简单地)依赖于纤维本身来调度彼此。 我想下一步将是在你每次想要它们执行一条指令时都必须向它们发送一个信号的线(这和我的5yo儿子没有什么不同:—)。在过去(甚至现在在一些嵌入式平台上),所有线程都是光纤,没有先发制人的情况,您必须编写线程才能正常运行。 |
![]() |
8
5
线程通常依赖于内核来中断线程,这样它或另一个线程就可以运行(这通常被称为先发制人的多任务处理),而光纤使用合作的多任务处理,因为光纤本身放弃了其运行时间,所以其他光纤可以运行。 一些比我可能更好地解释它的有用链接是: |
![]() |
9
3
Win32光纤定义实际上是在Sun Microsystems上建立的“绿线”定义。不需要在某类线程上浪费术语fiber,即在用户代码/线程库控制下在用户空间中执行的线程。 要澄清论点,请看以下评论:
我们应该假设进程是由线程组成的,线程应该由光纤组成。考虑到这种逻辑,将光纤用于其他类型的线程是错误的。 |
![]() |
bjy0212 · 协同程序运行时Unity游戏停止 3 年前 |
![]() |
Robin · 使用Kotlin协同例程时房间dao类出错 7 年前 |
![]() |
Praytic · 协同路由如何比线程更快? 7 年前 |
![]() |
Gaming Gecko · 从协同程序播放Unity动画 7 年前 |