18

タイトルが示すように、2 つ以上のスレッドが割り当てたヒープでメモリを共有するにはどうすればよいでしょうか? 私はそれについて考えてきましたが、どうすればそれができるのかわかりません。これがプロセスの私の理解です。おそらくどこかで間違っています。

任意のスレッドは、おそらくスレッドがスタックにコピーできるレジスターに書き込むことによって、このデータへのポインターを返すシステム呼び出しを行うことにより、ヒープ上の特定のバイト数を追加または削除できます。したがって、2 つのスレッド A と B は、必要なだけのメモリを割り当てることができます。しかし、スレッド B が割り当てたメモリの場所をスレッド A がどのように知ることができるかはわかりません。また、どちらかのスレッドが他のスレッドのスタックがどこにあるかを知る方法もわかりません。マルチスレッド プログラムはヒープを共有し、お互いのスタックにアクセスできると思いますが、その方法がわかりません。

この質問を検索しようとしましたが、詳細を抽象化する言語固有のバージョンしか見つかりませんでした。

編集:私は言語やOS固有にならないようにしていますが、Linuxを使用していて、低レベルの観点から見ています.アセンブリだと思います.

4

5 に答える 5

13

あなたの質問に対する私の解釈: スレッド A は、B が使用しているメモリへのポインタをどのように知ることができますか? どのようにデータを交換できますか?

回答: 通常は、共通メモリ領域への共通ポインタから始まります。これにより、他のデータへのポインターを含む他のデータを相互に交換できます。

例:

  1. メインスレッドは共有メモリを割り当て、その場所をp
  2. メイン スレッドは 2 つのワーカー スレッドを開始し、それらへのポインターpを渡します
  3. ワーカーはp、 が指すデータを使用して作業できるようになりました。p

実際の言語 (C#) では、次のようになります。

//start function ThreadProc and pass someData to it
new Thread(ThreadProc).Start(someData)

通常、スレッドは互いのスタックにアクセスしません。すべては、スレッド プロシージャに渡された 1 つのポインターから始まります。


スレッドの作成は OS の機能です。それはこのように動作します:

  1. アプリケーションは、標準の ABI/API を使用して OS を呼び出します
  2. OS がスタック メモリと内部データ構造を割り当てます
  3. OS は最初のスタック フレームを「偽造」します。つまり、命令ポインタを ThreadProc に設定し、someData をスタックに「プッシュ」します。この最初のスタック フレームが自然に発生するのではなく、OS によって人工的に作成されるため、「鍛造」と呼んでいます。
  4. OS がスレッドをスケジュールします。ThreadProc は、それが新しいスタックにセットアップされたことを知りません。知っているのは、 someData が通常のスタック位置にあることだけです。

これが、someData が ThreadProc に到達する方法です。これは、最初の初期データ項目が共有される方法です。ステップ 1 ~ 3 は、親スレッドによって同期的に実行されます。4 は子スレッドで発生します。

于 2012-08-10T22:04:22.357 に答える
2

鳥の視点からの非常に短い答え(1000マイル上):
スレッドは同じプロセスの実行パスであり、ヒープは実際にはプロセスに属します(結果としてスレッドによって共有されます)。各スレッドは、個別の作業単位として機能するために独自のスタックを必要とします。

于 2012-08-10T21:12:44.627 に答える
0

両方のスレッドが同じヒープを使用している場合、スレッドはヒープ上でメモリを共有できます。デフォルトでは、ほとんどの言語/フレームワークには、コードがヒープからメモリを割り当てるために使用できる単一のデフォルト ヒープがあります。アンマネージ言語では、通常、明示的な呼び出しを行ってヒープ メモリを割り当てます。C では、mallocたとえば などです。マネージ言語では、ヒープの割り当ては通常自動的に行われ、割り当ての方法は言語によって異なります (通常はnew演算子を使用します)。ただし、それはコンテキストにわずかに依存します。質問している OS または言語のコンテキストを提供していただければ、詳細を提供できる可能性があります。

于 2012-08-10T21:51:37.797 に答える
0

同じプロセスに属する他のスレッドと共有されるスレッド: コード セクション、データ セクション、および開いているファイルやシグナルなどの他のオペレーティング システム リソース。

于 2015-05-10T08:47:03.970 に答える