どの言語がネイティブ マルチスレッドをサポートしているか (またはサポートしていないか)、おそらく実装に関する詳細を知りたいと思っています。この特定の機能の完全な概要を作成できれば幸いです。
15 に答える
CPythonでは、 GILについて覚えておく必要があります。要約すると、マルチプロセッサマシンでも、1つのプロセッサのみが使用されます。コメントが示すように、これを回避する方法は複数あります。
C および C++ の古いバージョン (つまり、C89、C99、C++98、および C++03) は、コア言語でまったくサポートされていませんが、POSIX スレッドなどのライブラリは、一般的なユーザーのほぼすべてのプラットフォームで利用できます。今日。
C および C++ の最新バージョンである C11 および C++11 には、言語に組み込みのスレッド サポートがありますが、これは C11 のオプション機能であるため、シングルコア組み込みシステムなどの実装では、サポートしないことを選択できます。彼らが望むなら、C11の残りをサポートします。
Delphi/FreePascal もスレッドをサポートしています。
他の回答から、Windows プラットフォームでのみネイティブであると想定します。
TThread オブジェクトの上に優れた機能を実装するいくつかの優れたライブラリ:
Clojureは、同時実行性を適切に処理するように特別に設計された、JVM 向けの新進気鋭の Lisp 方言です。
これは、機能的なスタイルの API、さまざまな不変データ構造の非常に効率的な実装、およびエージェント システム (Scala のアクターや Erlang のプロセスに少し似ています) を特徴としています。ソフトウェア トランザクショナル メモリもあります。
全体として、Clojure は、正しいマルチスレッドおよび並行コードを作成するのに非常に役立ちます。
公式の squeak VM はネイティブ (OS) スレッドをサポートしていないと思いますが、Gemstone バージョンはサポートしています。
(正しくない場合は自由に編集してください)。
最近、Lua Lanesという Lua のマルチスレッド拡張機能を作成しました。それはマルチスレッドの概念を言語に非常に自然にマージするので、「組み込み」のマルチスレッドがこれ以上優れているとは思えません。
ちなみに、Lua に組み込まれている協調型マルチスレッド (コルーチン) もよく使用されます。レーンの有無にかかわらず。
Lanes には GIL がなく、スレッドごとに別々の Lua ユニバースでコードを実行します。したがって、C ライブラリがクラッシュしない限り、スレッドの使用に関連する問題の影響を受けません。実際、この概念はプロセスやメッセージ パッシングに似ていますが、使用される OS プロセスは 1 つだけです。
この質問は意味がありません: 特定の実装がスレッドをネイティブ スレッドとして実装することを選択するか、グリーン スレッドとして実装することを選択するかは、言語とは何の関係もありません。それは内部実装の詳細です。
ネイティブ スレッドを使用する Java 実装と、グリーン スレッドを使用する Java 実装があります。
ネイティブ スレッドを使用する Ruby 実装と、グリーン スレッドを使用する Ruby 実装があります。
ネイティブ スレッドを使用する Python 実装と、グリーン スレッドを使用する Python 実装があります。
古い LinuxThreads ライブラリや GNU pth ライブラリなど、グリーン スレッドを使用する POSIX スレッドの実装さえあります。
また、実装でネイティブ スレッドを使用しているからといって、これらのスレッドが実際に並列実行できるわけではありません。多くの実装では、グローバル インタープリター ロックを使用して、一度に 1 つのスレッドしか実行できないようにしています。一方、グリーン スレッドを使用しても、並列で実行できないわけではありません。たとえば、BEAM Erlang VM は複数の CPU コアにわたってグリーン スレッド (より正確にはグリーン プロセス) をスケジュールできます。同じことが Rubinius でも計画されています。ルビーVM.
Perl は、ネイティブ スレッドを有効にサポートしていません。
はい、Perl スレッド モジュールがあり、実装でネイティブ プラットフォーム スレッドを使用します。問題は、一般的なケースではあまり役に立たないことです。
Perl スレッドを使用して新しいスレッドを作成すると、Perl インタープリターの状態全体がコピーされます。これは非常に遅く、大量の RAM を使用します。実際、Unix で fork() を使用するよりもおそらく遅いでしょう。後者はコピー オン ライトを使用し、Perl スレッドは使用しないためです。
しかし、一般に、各言語には独自のスレッド モデルがあり、一部の言語は他とは異なります。Python は (ほとんどの場合) ネイティブ プラットフォーム スレッドを使用しますが、一度に 1 つのみ (Python コード) が実行されることを保証する大きなロックがあります。これには実際にいくつかの利点があります。
スレッドは、最近ではプロセスが優先されて流行遅れになっているのではないですか? (Google Chrome、IE8 を考えてください)
このコンテキストで「ネイティブ」を定義する必要があります。
Java は、ある種の組み込みマルチスレッドを主張していますが、粗粒度のロックと一部のライブラリ サポートに基づいているだけです。現時点では、POSIX スレッドを使用する C より「ネイティブ」ではありません。C++ (0x) の次のバージョンには、スレッド ライブラリも含まれます。
Java と C# がマルチスレッドをサポートしており、C++ の次のバージョンがそれを直接サポートすることを知っています... (計画された実装は、boost.org ライブラリの一部として利用できます...)
Boost::threadは素晴らしいですが、言語の一部と言えるかどうかはわかりません。CRT/STL/Boost を C++ の「一部」と見なすか、オプションのアドオン ライブラリと見なすかによって異なります。
(それ以外の場合、ネイティブ スレッドはすべて OS の機能であるため、ほとんどの言語にネイティブ スレッドはありません)。