3

C++ はマルチスレッドのネイティブ サポートを提供していないと聞いたことがあります。マルチスレッド C++ アプリは、マルチスレッド用のマネージ コードに依存していると思います。たとえば、Visual C++ アプリは MFC や .NET などを使用して、マルチスレッド機能を提供していました。さらに、これらのマネージ コード機能の一部またはすべては、アンマネージ アプリケーションでは使用できないと想定しています。しかし、管理されていないマルチスレッド アプリケーションについて読んだことがあります。これはどのように可能ですか?私の仮定のどれが間違っていますか?

4

8 に答える 8

12

マルチスレッドのサポートを提供するかどうかは、完全にオペレーティング システム次第です。Windows では、Win32 API を介して必要な機能を利用できます。MFCなどのフレームワークは、単純化するために低レベルのスレッド関数のラッパーを提供します。もちろん、.NET/CLR には、Win32 マルチスレッド機能にアクセスするための独自のマネージ インターフェイスがあります。

この記事( C++ でのマルチスレッド化 )で適切な説明が提供されています。

C++ にマルチスレッドのサポートが組み込まれていないのはなぜですか?

C++ には、マルチスレッド アプリケーションの組み込みサポートは含まれていません。代わりに、この機能を提供するためにオペレーティング システムに完全に依存しています。Java と C# の両方がマルチスレッドの組み込みサポートを提供していることを考えると、これが C++ にも当てはまらない理由を尋ねるのは自然なことです。その答えは、効率、制御、および C++ が適用されるアプリケーションの範囲です。それぞれ調べてみましょう。

マルチスレッドのサポートを組み込まないことで、C++ は「フリーサイズ」のソリューションを定義しようとしません。代わりに、C++ を使用すると、オペレーティング システムが提供するマルチスレッド機能を直接利用できます。このアプローチは、実行環境でサポートされている最も効率的な方法でプログラムをマルチスレッド化できることを意味します。多くのマルチタスク環境はマルチスレッドの豊富なサポートを提供するため、そのサポートにアクセスできることは、高性能のマルチスレッド プログラムを作成するために不可欠です。

于 2009-05-11T00:22:17.917 に答える
4

C ++でのマルチスレッド化には、マネージコードは必要ありません。

C ++がグラフィックの表示、音声の出力、またはマウスからの入力の読み取りをネイティブでサポートしていないのとほぼ同じように、使用されているオペレーティングシステムは、これらの機能を利用するためのC++APIを提供します。

C++がそれを実行できないことは問題ではありません。まだC++標準に書き込まれていません。

于 2009-05-11T02:08:15.950 に答える
3

あなたの仮定のいくつかは完全に正しくありません。オペレーティング システム (.NET について言及しているので、win32 について話している) は、スレッド化をサポートしています。多くの優れたスレッド ライブラリがあります。マルチスレッドを「より簡単」にするためにC++のOS機能の上に構築されます:)-たとえば pthreads 。詳細は MSDN にあります。

于 2009-05-11T00:24:16.760 に答える
2

プログラミング言語 C++ の ISO 標準では、マルチスレッドを定義も禁止もしていません。実装は、必要に応じて拡張機能を提供できます。プログラムは、必要に応じて実装拡張機能を使用することが許可されており、プログラムはそれらの拡張機能を提供するシステムでのみ実行されます。

比較のために、プログラミング言語 C++ の ISO 標準では、マウスの使用を定義も禁止もしていません。プログラムは実装拡張機能を使用することが許可されており、それらの拡張機能を提供するシステムでのみ実行されます。別の比較として、C++ の ISO 標準は UTF-8 を定義も禁止もしていないため、プログラムは Latin-1 に依存でき、プログラムは Latin-1 を提供するシステムでのみ実行されます。

于 2009-05-11T02:26:14.343 に答える
1

ネイティブ C++ は、"ビルトイン" マルチスレッド サポートを提供していません。それは、意図されていなかったか、実際には必要とされていなかったからです。あなたの誤解は、これが欠点であるということですが、実際には言語の強みです。マルチスレッドに「気付かない」ことで、C++ は、コードがコンパイルおよび実行される OS によって提供される MT サポートとシームレスに統合されます。これにより、いわば独自の「MT バゲージ」が付属している場合よりもはるかに高い柔軟性と効率が提供されます。例として MFC と .NET について言及しています。これらのライブラリ/ラッパーは、基本的な Win32 API のレイヤーにすぎないことに注意してください。意図したとおりに C++ を使用すると、OS 固有の MT API 呼び出し (スレッド作成など) からロジックを分離する限り、どの OS でもマルチスレッドで実行される効率的なコードが提供されます。

于 2009-05-11T07:46:54.213 に答える
0

「マネージド」コードの定義を誤解していると思います。「マネージド」コードは、.NET フレームワークを使用するコードを意味する Microsoft 固有の用語であり、したがって .NET のさまざまな側面の影響を受けます。「アンマネージド」コードとは、その外部で実行され、.NET レイヤーを介して動作しないコードを意味します。MFC コードは「管理されていません」。これは、ユビキタスな Win32 API (Windows で利用可能な最低レベルの API でさえありません) の見事に悪いラッパーにすぎません。

.NET ライブラリ (マルチスレッドを含む) は、ほぼすべて、あるレベルでは、従来の「管理されていない」アプリケーションで使用されるより基本的なシステム API のインターフェイスです。一般的に言えば、十分な労力をかけて「アンマネージ」コードに複製できない「マネージ」コードで利用できる機能はありませんが、その逆は真ではありません (詳しく知りたい場合は、これを抽象化ペナルティと呼びます)。「管理された」コードで行う方が簡単かもしれませんが、それは、多かれ少なかれ、「管理されていない」コードがどこかでそれを行っているからです。スレッド化 API の場合、これはオペレーティング システム カーネルへのインターフェイスであり、それ自体がプロセッサの機能にアクセスして、プロセスを複数の場所で同時に実行できるようにします (複数のコアを使用している場合は、それ以外の場合は '

C++ 標準では現在、スレッドの定義は提供されていません (今後の C++1x 標準では提供されます)。Win32 および MFC によって提供されるもの、POSIX システムにある pthreads ライブラリ、プラットフォームのローカル スレッド ライブラリを使用する Boost.Thread など、さまざまなスレッド ライブラリが利用可能です。

于 2009-05-11T07:54:30.847 に答える
0

言語構造と JVM 仕様を定義した Java とは異なり、C++ 標準はスレッド化を意識していません (C もそうです)。これらの言語に関する限り、スレッドに関連するものはすべて、OS 機能への関数呼び出しで構成されます。マルチスレッド用にコンパイルされたライブラリは、単に同じ呼び出しを意味しますが、言語の観点からは単純な古いコードです。

于 2009-05-11T02:40:06.803 に答える