6

他の人が書いたプロジェクトの多くの場所でそのようなコードに出くわしましたが、なぜ誰かがそのようなコードを書くのか、いまだに困惑しています。

次のコードを考えてみましょう (このコードは C# ですが、多くの言語にも当てはまると思います - おそらく構文やクラスの名前とこれを行う方法が異なるだけです - あなたはアイデアを得る.):

Thread thread;

thread = new Thread(new ThreadStart(method));
thread.Start();
thread.Join();

私の理解では、このコードはスレッドを開始して実行methodし、このスレッドは他のことを何もせずに、新しく開始されたスレッドが終了するのを待つことを意味します。

その場合、メソッドを直接呼び出さない理由、つまり

method()

私の理解が正しいかどうか、誰か説明してもらえますか? 最初のコード フラグメントは、2 番目のコード フラグメントと機能的に同じですか?

4

2 に答える 2

12

通常、その通りです。これはあまり便利なことではありません。

ただし、スレッドごとの状態を変更または依存するため、操作を別のスレッドで実行したい場合があります。

関数はスレッド ローカル データをいじったり、ネイティブ COM コードを呼び出したりする可能性があり、COM のスレッド アパートメントはスレッドごとに初期化されるため、呼び出しコードの変更による影響を避けるために、関数を呼び出すために新しいスレッドをスピンオフしたいだけです。

もちろん、そのような場合は、明らかに役に立たないことが行われている理由を説明する小さなコード コメントを付けることは、おそらく良い考えです。;)

于 2012-11-12T13:35:01.087 に答える
4

機能的には、両方のコードは同じです。スレッドのケースは、高価格への呼び出しの委任にすぎません。ただし、役立つ場合がいくつかあります。

  • スレッドには別のセキュリティ コンテキストがありますが、デフォルトで実行したいと考えています。偽装は、プールからスレッドを割り当てるのとほぼ同じプロセッサ時間のコストがかかる可能性があります
  • スレッドの優先度が現在よりも大きい(またはしばらくの間低い)ため、コードの重要な小さな部分を実行時に近く実行できます。優先度が低い場合は、大きな待機を想定します (たとえば、ユーザー入力から)。
于 2012-11-12T13:36:44.493 に答える