我想知道哪些语言支持(或不支持)本机多线程,也许会得到一些关于实现的细节。希望我们可以对这个特定功能进行完整的概述。
15 回答
我认为比Haskell更高级的语言列表很短,并且对并发和并行性有很好的支持。
旧版本的 C 和 C++(即 C89、C99、C++98 和 C++03)在核心语言中根本不支持,尽管 POSIX 线程等库可用于普通用户的几乎所有平台今天。
C 和 C++ 的最新版本,C11 和 C++11,确实在语言中内置了线程支持,但它是 C11 的一个可选特性,因此单核嵌入式系统等实现可以选择不支持它,而如果他们愿意,可以支持 C11 的其余部分。
使用 CPython,必须记住GIL。总结一下:即使在多处理器机器上,也只使用一个处理器。正如评论所示,有多种方法可以解决这个问题。
Clojure是一种用于 JVM 的新兴 Lisp 方言,专门设计用于处理并发。
它具有函数式 API、各种不可变数据结构的一些非常有效的实现和代理系统(有点像 Scala 中的演员和 Erlang 中的进程)。它甚至具有软件事务内存。
总而言之,Clojure 竭尽全力帮助您编写正确的多线程并发代码。
这个问题没有意义:特定实现选择将线程实现为原生线程还是绿色线程与语言无关,这是一个内部实现细节。
有使用本机线程的 Java 实现和使用绿色线程的 Java 实现。
有使用本机线程的 Ruby 实现和使用绿色线程的 Ruby 实现。
有使用本机线程的 Python 实现和使用绿色线程的 Python 实现。
甚至还有使用绿色线程的 POSIX 线程实现,例如旧的 LinuxThreads 库或 GNU pth 库。
并且仅仅因为实现使用本机线程并不意味着这些线程实际上可以并行运行。许多实现使用全局解释器锁来确保一次只能运行一个线程。另一方面,使用绿色线程并不意味着它们不能并行运行:例如,BEAM Erlang VM 可以跨多个 CPU 内核调度其绿色线程(更准确地说是绿色进程),Rubinius 也是如此红宝石虚拟机。
Perl 没有有用地支持本机线程。
是的,有一个 Perl 线程模块,是的,它在实现中使用了本机平台线程。问题是,它在一般情况下不是很有用。
当您使用 Perl 线程创建新线程时,它会复制 Perl 解释器的整个状态。这非常慢并且使用大量内存。事实上,它可能比在 Unix 上使用 fork() 慢,因为后者使用写时复制,而 Perl 线程不使用。
但总的来说,每种语言都有自己的线程模型,有些与其他语言不同。Python(大部分)使用本机平台线程,但有一个大锁,可确保一次只运行一个(Python 代码)。这实际上有一些优点。
这些天线程不是过时而有利于流程吗?(想想谷歌浏览器,IE8)
我最近为 Lua 做了一个多线程扩展,叫做Lua Lanes。它将多线程概念如此自然地融合到语言中,我认为“内置”多线程不会更好。
作为记录,Lua 内置的协作多线程(协程)通常也可以使用。有或没有车道。
Lanes 没有 GIL,每个线程在不同的 Lua 宇宙中运行代码。因此,除非您的 C 库崩溃,否则它不会受到与线程使用相关的问题的影响。事实上,这个概念更像是进程和消息传递,尽管只使用了一个 OS 进程。
我相信官方 squeak VM 不支持本机 (OS) 线程,但 Gemstone 版本支持。
(如果不正确,请随时编辑)。
您需要在此上下文中定义“本机”。
Java声称某种内置的多线程,但只是基于粗粒度锁定和一些库支持。目前,它并不比带有 POSIX 线程的 C 更“原生”。下一版本的 C++ (0x) 也将包括一个线程库。
我知道 Java 和 C# 支持多线程,并且下一版本的 C++ 将直接支持它......(计划的实现可作为 boost.org 库的一部分......)
Boost::thread很棒,但我不确定你是否可以说它是语言的一部分。这取决于您是否认为 CRT/STL/Boost 是 C++ 的“一部分”,或者是可选的附加库。
(否则实际上没有语言具有本机线程,因为它们都是操作系统的功能)。
最后Go
是带有自己的 pkg 的多线程Goroutine
。人们说它是关于C-language
. 它也易于使用和理解。