1

スレッドの安全性、再入可能性に関する質問について、ここで提供された多くの回答を読みましたが、それらについて考えると、さらにいくつかの質問が頭に浮かんだので、この質問/s.

1.) *.exe という実行可能プログラムが 1 つあります。このプログラムをコマンド プロンプトで実行し、その実行中に別のコマンド プロンプトで同じプログラムを実行すると、どのような状況で結果が破損する可能性があるか、つまり、このプログラムのコードが再入可能であるか、または単独でスレッドセーフ?

2.) 再入可能性を定義する際に、既に実行中のルーチンに再入できると言い、どのような状況で関数に再入できるか (再帰ルーチンであることは別として、ここでは再帰実行については話していません) . 同じコードを再度実行するには、何らかのスレッドが必要です。または、その関数に再び入るにはどうすればよいでしょうか?

3.) 実際のケースでは、2 つのスレッドが同じコードを実行します。つまり、同じ機能を実行します。マルチスレッドのアイデアは、異なる機能を同時に(異なるコア/プロセッサで)実行することだと思いました。

これらのクエリが異なっているように見える場合は申し訳ありませんが、SO に関するスレッドセーフな Vs リエントラントの投稿について読んだときに、それらはすべて私に思い浮かびました。したがって、それらをまとめました。

任意のポインター、読み物をいただければ幸いです。

ありがとう、

-広告。

4

3 に答える 3

1

これらを順番に説明します。

  1. 各プログラムは独自のプロセスで実行され、独自の分離されたメモリ空間を取得します。この状況では、スレッド セーフについて心配する必要はありません。(ただし、プロセスが両方ともファイルなどの他の共有リソースにアクセスしている場合は、別の問題が発生する可能性があります。たとえば、プロセス 1 がデータ ファイルを「ロック」し、プロセス 2 がファイルを開くことができない場合があります)。

  2. ここでの考え方は、2 つのスレッドが同じルーチンを同時に実行しようとする可能性があるということです。これは常に有効であるとは限りません。複数のスレッドが同じクラスの同じインスタンスまたは同じ静的関数をエラーなしで使用できるようにクラスまたはプロセスを定義するには、特別な注意が必要です。これには通常、クラスでの同期が必要です。

  3. 多くの場合、2 つのスレッドが同じコードを実行します。スレッド化時に作業を分割するには、2 つの異なる概念的な方法があります。タスクの観点から考えることができます。つまり、あるスレッドがタスク A を実行し、別のスレッドがタスク B を実行します。あるいは、データに基づいて問題を分解するという観点から考えることができます。この場合、大規模なコレクションを操作し、各要素は同じルーチンを使用して処理されますが、処理は並行して行われます。詳細については、Decomposition for Parallelism について書いたこのブログ投稿を参照してください。

于 2010-01-26T18:22:53.620 に答える
0

First of all, I strongly suggest you to look at some basic stuffs of computer system, especially how a process/thread is executing on CPU and scheduled by operating system. For example, virtual address, context switching, process/thread concepts(e.g., each thread has its own stack and register vectors while heap is shared by threads. A thread is an execution and scheduling unit, so it maintains control flow of code..) and so on. All of the questions are related to understanding how your program is actually working on CPU

1) and 2) are already answered.

3) Multithreading is just concurrent execution of any arbitrary thread. The same code can be executed by multiple threads. These threads can share some data, and even can make data races which are very hard to find. Of course, many times threads are executing separate code(we say it as thread-level parallelism).

In this context, I have used concurrent as two meaning: (a) in a single processor, multiple threads are sharing a single physical processor, but operating system gives a sort of illusion that threads are running concurrently. (b) In a multicore, yes, physically two or more threads can be executed concurrently.

Having concrete understanding of concurrent/parallel execution takes quite long time. But, you already have a solid understanding!

于 2010-01-26T19:03:05.163 に答える
0
  1. 2 つのプロセスがメモリを共有することはできません。したがって、スレッドセーフはここでは議論の余地があります。

  2. 再入可能性とは、2 つのスレッドが同時にメソッドを安全に実行できることを意味します。これには再帰は必要ありません。スレッドは個別の実行単位であり、両方が同じメソッドを同時に実行しようとするのを妨げるものは何もありません。

  3. スレッド化の利点は、2 つの方法で発生します。1 つは、異なる種類の操作を同時に実行する場合です (CPU を集中的に使用するコードと I/O を集中的に使用するコードを同時に実行するなど)。もう 1 つは、長時間実行される操作を複数のプロセッサに分割できる場合です。後者の場合、2 つのスレッドが異なる入力データ セットに対して同じ関数を同時に実行している可能性があります。

于 2010-01-26T18:22:15.587 に答える