M:N线程模型(例如goroutines)有哪些缺点?

时间:2017-07-08 04:07:34

标签: multithreading go language-agnostic erlang programming-languages

M:N threading是一个将M个用户线程映射到N个内核线程的模型。这样可以创建大量(M)的用户线程,因为它们重量轻,仍然允许(N路)并行。

这对我来说似乎是双赢的,那么为什么这么少的语言/实现使用这种线程模型?我所知道的唯一例子是Go的“goroutines”和Erlang的过程。

M:N线程的缺点是什么?为什么其他语言不使用这种表面看起来很有希望的线程模型呢?

1 个答案:

答案 0 :(得分:0)

部分原因是“这是其他人正在做的事情”。虽然在Go之前确实存在M:N线程,但所有主流语言(C,C ++,Perl,Java,C#,Python,Ruby,PHP)都使用线程,其中许多(Python,Ruby)做得不好。 Go是第一种显示M:N线程可以很好地运行的流行语言。

部分原因是因为线程是操作系统的原生原语。

实现M:N线程使OS代码/ C库的互操作变得更加困难。在调用C / OS代码时,Go必须从小的goroutine堆栈切换到常规的OS堆栈。

许多其他流行语言(Python,Ruby)更多地依赖于调用C代码而不是Go的能力,因此对它们进行优化更为重要。

好M:与OS / C代码进行N线程互操作并不是不可能的(Go可以做到这一点)但是如果你做了操作系统,它会更容易。