哪些高级语言支持多线程?
我想知道哪种语言支持(或者不支持)本机多线程,也许还可以获得有关实现的一些详细信息。希望我们可以对此特定功能提供完整的概述。
解决方案
尽管较早版本的C和C ++(即C89,C99,C ++ 98和C ++ 03)在核心语言中完全不支持,但是普通用户几乎可以在每个平台上使用诸如POSIX线程之类的库。今天。
C和C ++的最新版本C11和C ++ 11确实具有该语言的内置线程支持,但这是C11的可选功能,因此单核嵌入式系统之类的实现可以选择不支持该功能。如果他们愿意,可以支持C11的其余部分。
我相信官方的吱吱声虚拟机不支持本机(OS)线程,但Gemstone版本支持。
(如果不正确,请随时进行编辑)。
我们需要在这种情况下定义"本机"。
Java声称某种内置的多线程,但仅基于粗粒度锁定和某些库支持。目前,使用POSIX线程,它不比C更"本机"。下一版本的C ++(0x)也将包括线程库。
我知道Java和Csupport支持多线程,而C ++的下一版本将直接支持它...(计划的实现可作为boost.org库的一部分使用。)
Perl和Python可以。 Ruby正在开发它,但是Ruby 1.8中的线程并不是真正的线程。
Boost :: thread很棒,但是我不确定我们是否可以说出它在语言中的作用。这取决于我们是否将CRT / STL / Boost视为C ++的"一部分",或者是可选的添加库。
(否则,几乎没有语言具有本机线程,因为它们都是操作系统的功能)。
使用CPython,必须记住有关GIL的知识。总结一下:即使在多处理器计算机上,也只使用一个处理器。如注释所示,有多种解决方法。
Erlang具有对并发编程的内置支持。
严格来说,Erlang进程是greenlet。但是语言和虚拟机是从头开始设计的,以支持并发。该语言具有用于异步进程间消息传递的特定控制结构。
在Python中,greenlet是提供轻量级线程和基于通道的消息传递的第三方程序包。但是,它不能与Erlang进行比较。
Delphi / FreePascal也支持线程。
从其他答案中,我将假定它仅在Windows平台上是本机的。
一些不错的库在TThread对象的顶部实现了更好的功能:
- OmniThreadLibrary
- 线程
我想比Haskell更高级别的语言列表很短,并且对并发和并行性有很好的支持。
这个问题没有道理:一个特定的实现是选择将线程作为本机线程还是绿色线程来实现,与该语言无关,这是内部实现的细节。
有使用本地线程的Java实现和使用绿色线程的Java实现。
有使用本地线程的Ruby实现和使用绿色线程的Ruby实现。
有使用本地线程的Python实现和使用绿色线程的Python实现。
甚至有使用绿色线程的POSIX Thread实现,例如旧的LinuxThreads库或者GNU pth库。
仅仅因为实现使用本机线程并不意味着这些线程实际上可以并行运行。许多实现使用全局解释器锁来确保一次只能运行一个线程。另一方面,使用绿色线程并不意味着它们不能并行运行:例如,BEAM Erlang VM可以跨多个CPU内核调度其绿色线程(更确切地说是绿色进程),Rubinius也计划这样做。 Ruby VM。
Perl无法有效地支持本机线程。
是的,有一个Perl线程模块,是的,它在其实现中使用本机平台线程。问题是,在一般情况下它不是很有用。
使用Perl线程创建新线程时,它将复制Perl解释器的整个状态。这非常慢,并且占用大量RAM。实际上,它可能比在Unix上使用fork()慢,因为后者使用写时复制,而Perl线程不使用。
但是总的来说,每种语言都有其自己的线程模型,其中一些与其他语言有所不同。 Python(大多数)使用本机平台线程,但是具有很大的锁,可以确保一次只能运行一次(Python代码)。这实际上具有一些优点。
这些天不是为了支持流程而过时吗? (想想谷歌浏览器,IE8)
我最近为Lua做了一个多线程扩展,称为Lua Lanes。它很自然地将多线程概念合并到语言中,以至于我看不到"内置"多线程会更好。
作为记录,通常也可以使用Lua内置的协作多线程(协程)。有无车道。
Lanes没有GIL,并且每个线程在单独的Lua Universe中运行代码。因此,除非C库崩溃,否则它不会受到与线程使用相关的问题的影响。实际上,尽管仅使用一个OS进程,但该概念更像是进程和消息传递。
Clojure是针对JVM的新兴Lisp方言,专门设计用于很好地处理并发性。
它具有功能风格的API,各种不可变数据结构的一些非常有效的实现以及代理系统(Scala中的actor和Erlang中的进程类似位)。它甚至具有软件事务存储。
总而言之,Clojure可以极大地编写正确的多线程和并发代码。