0

Visual Studio 2010、Windows XP SP3で以下のC#コードを実行しています。

「デバッグなしで開始」(Ctrl + F5またはメニューから)で、次の出力が表示されます。

  • メインから
    こんにちは労働者からこんにちは

「デバッグから開始」(F5またはメニューから)は、逆の順序を示します。

  • 労働者から
    こんにちはメインからこんにちは

何度もチェックしました。再現性と再現性があります。
なんで?

using System;
using System.Threading;

namespace _5NamingThreads
{
  class ThreadNaming
  {
    static void Main()
    {
      Thread.CurrentThread.Name = "main";
      Thread worker = new Thread(Go);
      worker.Name = "worker";
      worker.Start();
      Go();
      Console.ReadLine();
    }

    static void Go()
    {
      Console.WriteLine("Hello from " + Thread.CurrentThread.Name);
    }
  }
}

更新
翌日、コンピューターを再起動した後、リリースとデバッグのすべてのモードで非常に再現可能な順序を常に観察します。

  • メインから
    こんにちは労働者からこんにちは

フォローアップの質問:
デバッグ中に、コードの各行にステップインせずに出力を確認することは可能ですか?

4

2 に答える 2

5

デバッグ モードでは、スレッドの起動プロセスで、新しいスレッドでデバッグ コンテキストを初期化する必要があります。元のスレッドが新しいスレッドで動作する可能性があるため、関数が戻る前にこれを完了する必要があります。最終的な結果として、これにより元のスレッドが遅くなり、新しいスレッドが最初に実行されるようになります。

もちろん、これはあなたが頼るべきものではありませ。オペレーティング システム、ライブラリ、デバッガ、CPU などの次のバージョンで変更される可能性があります。

于 2013-02-22T18:16:02.443 に答える
3

これは、新しい非同期スレッドのスピンアップが非決定論的であるためです。つまり、開発者は、スレッドが同じ順序で実行されることに依存することはできません。競合状態を参照してください。

于 2013-02-22T18:18:19.933 に答える