multithreading - 线和纤维有什么区别?

标签 multithreading concurrency coroutine fibers

线和纤维有什么区别?我听说过 ruby​​ 中的纤维,也听说过它们有其他语言版本,有人可以用简单的术语向我解释一下线程和纤维之间的区别吗?

最佳答案

用最简单的术语来说,线程通常被认为是抢占式的(尽管这可能并不总是正确的,具体取决于操作系统),而纤程则被认为是轻量级的协作线程。两者都是您的应用程序的单独执行路径。

对于线程:当前执行路径可能随时被中断或抢占(注意:此声明是一个概括,根据操作系统/线程包/等,可能并不总是成立)。这意味着对于线程来说,数据完整性是一个大问题,因为一个线程可能会在更新一大块数据的过程中停止,从而使数据的完整性处于不良或不完整的状态。这也意味着操作系统可以通过同时运行多个线程来利用多个 CPU 和 CPU 内核,并由开发人员来保护数据访问。

对于纤程:只有当纤程产生执行时,当前执行路径才会被中断(与上面的注释相同)。这意味着光纤始终在明确定义的位置启动和停止,因此数据完整性不再是问题。此外,由于纤程通常在用户空间中进行管理,因此无需进行昂贵的上下文切换和 CPU 状态更改,从而使得从一根纤程到下一根纤程的更改极其高效。另一方面,由于没有两个纤程可以完全相同地运行,因此仅使用纤程将无法充分利用多个 CPU 或多 CPU 核心。

关于multithreading - 线和纤维有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/796217/

相关文章:

c# - 在基于 Unity 的 Roguelike 中调整代码执行

multithreading - 使用线程时的内存管理

php - 为线程安全动态配置 PHP --enable-maintainer-zts,还是使用 yum 安装 pthreads?

java - 避免线程安全内存供应商中的 volatile 读取

go - 如何在 Golang 中同时通过 STDIN/STDOUT 连接多个程序读/写?

android - 有没有更好的方法可以在协程中设置n次监听器?

C++1z协程线程上下文和协程调度

c - 为什么 Apache MPM prefork.c 使用互斥量来保护 accept()?

multithreading - 使用 channel 和线程时我要等待或加入什么?

Java EE 7 - 注入(inject) Runnable/Callable 对象