哪些高级语言支持多线程?

时间:2008-09-26 17:04:07

标签: multithreading programming-languages

我想知道哪些语言支持(或不支持)本机多线程,并且可能获得有关实现的一些细节。希望我们能够完整地概述这一特定功能。

15 个答案:

答案 0 :(得分:6)

Erlang内置了对concurrent programming的支持。

严格地说,Erlang进程是greenlets。但语言和虚拟机是从头开始设计的,以支持并发。该语言具有用于异步进程间消息传递的特定控制结构。

在Python中,greenlet是第三方软件包,提供轻量级线程和基于通道的消息传递。但它与Erlang没有比较。

答案 1 :(得分:3)

旧版本的C和C ++(即C89,C99,C ++ 98和C ++ 03)在核心语言中根本不支持,尽管POSIX线程等库几乎可用于所有平台今天在普通用户中。

最新版本的C和C ++,C11和C ++ 11在语言中都有内置的线程支持,但它是C11的可选功能,因此单核嵌入式系统等实现可以选择不使用支持它,同时支持C11的其余部分,如果他们愿意的话。

答案 2 :(得分:3)

使用CPython,必须记住GIL。总结一下:即使在多处理器机器上,也只使用一个处理器。正如评论所示,有很多方法可以解决这个问题。

答案 3 :(得分:3)

我认为高于Haskell的语言列表非常短,并且对concurrency and parallelism有很好的支持。

答案 4 :(得分:2)

Delphi / FreePascal也支持线程。

我会从其他答案中假设它只是Windows平台上的原生。

一些很好的库,可以在TThread对象之上实现更好的功能:

答案 5 :(得分:2)

Clojure是JVM的新兴Lisp语言,专门用于处理并发性。

它具有功能样式API,一些非常各种不可变数据结构的高效实现,以及代理系统(像Scala中的actor和Erlang中的进程)。它甚至还有软件事务存储器。

总而言之,Clojure可以帮助您编写正确的多线程和并发代码。

答案 6 :(得分:1)

我认为官方的吱吱声VM不支持本机(OS)线程,但是Gemstone版本支持。

(如果不正确,请随意编辑)。

答案 7 :(得分:1)

您需要在此上下文中定义“native”。

Java声称某种内置多线程,但它只是基于粗粒度锁定和一些库支持。此时,它与POSIX线程不比C更“本机”。下一版本的C ++(0x)也将包含一个线程库。

答案 8 :(得分:1)

我知道Java和C#支持多线程,并且下一版本的C ++将直接支持它...(计划的实现作为boost.org库的一部分提供......)

答案 9 :(得分:1)

Boost::thread很棒,我不确定你是否可以说出它的一部分语言。这取决于您是否认为CRT / STL / Boost是C ++的“部分”或可选的附加库。

(否则几乎没有语言具有原生线程,因为它们都是操作系统的一部分功能)。

答案 10 :(得分:1)

这个问题没有意义:特定实现选择将线程实现为本机线程还是绿色线程与语言无关,这是一个内部实现细节。

有些Java实现使用本机线程和使用绿色线程的Java实现 有些Ruby实现使用本机线程和使用绿色线程的Ruby实现 有些Python实现使用本机线程和使用绿色线程的Python实现 甚至有POSIX线程实现使用绿色线程,例如旧的LinuxThreads库或GNU pth库。

并且仅仅因为实现使用本机线程并不意味着这些线程实际上可以并行运行;许多实现使用全局解释器锁来确保一次只能运行一个线程。另一方面,使用绿色线程并不意味着它们不能并行运行:例如,BEAM Erlang VM可以跨越多个CPU内核调度其绿色线程(更确切地说是绿色进程),同样计划用于Rubinius Ruby VM。

答案 11 :(得分:1)

Perl不能有效地支持本机线程。

是的,有一个Perl线程模块,是的,它在其实现中使用本机平台线程。问题是,它在一般情况下不是很有用。

使用Perl线程创建新线程时,它会复制Perl解释器的整个状态。这非常慢并且使用大量RAM。实际上它可能比在Unix上使用fork()慢,因为后者使用copy-on-write而Perl线程则不然。


但总的来说,每种语言都有自己的线程模型,有些与其他语言不同。 Python(大多数)使用本机平台线程,但有一个大锁,确保只有一个运行(Python代码)一次。这实际上有一些优点。

这些天不是线程过时了而不支持流程吗? (想想谷歌Chrome,IE8)

答案 12 :(得分:1)

我最近为Lua做了多线程扩展,称为Lua Lanes。它将多线程概念自然地融合到语言中,我不会看到“内置”多线程更好。

为了记录,Lua建立的合作多线程(协同程序)通常也可以使用。有或没有车道。

Lanes没有GIL,并且每个线程在单独的Lua Universe中运行代码。因此,除非您的C库崩溃,否则它不受与线程使用相关的问题的影响。事实上,虽然只使用了一个操作系统进程,但这个概念更像是进程和消息传递。

答案 13 :(得分:0)

PerlPython。 Ruby正在研究它,但Ruby 1.8中的线程并不是真正的线程。

答案 14 :(得分:0)

最后,Go在这里具有自己的pkg Goroutine的多线程。 人们说它是在C-language的结构上。 它也易于使用和理解。