マルチスレッドのちょっとした悟り


まず簡単な例を見てみましょう.
using System;
using System.Threading;
// Simple threading scenario: Start a static method running
// on a second thread.
public class ThreadExample
{
    // The ThreadProc method is called when the thread starts.
    // It loops ten times, writing to the console and yielding 
    // the rest of its time slice each time, and then ends.
    public static void ThreadProc()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("ThreadProc: {0}", i);
            // Yield the rest of the time slice.
            Thread.Sleep(1000);
        }
    }

    public static void Main()
    {
        Console.WriteLine("Main thread: Start a second thread.");
        // The constructor for the Thread class requires a ThreadStart 
        // delegate that represents the method to be executed on the 
        // thread. C# simplifies the creation of this delegate.
        Thread t = new Thread(new ThreadStart(ThreadProc));
        // Start ThreadProc. On a uniprocessor, the thread does not get 
        // any processor time until the main thread yields. Uncomment 
        // the Thread.Sleep that follows t.Start() to see the difference.
        t.Start();
        //Thread.Sleep(0);

        for (int i = 0; i < 4; i++)
        {
            Console.WriteLine("Main thread: Do some work.");
            Thread.Sleep(1000);
        }

        Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
        if (t.ThreadState == ThreadState.Running)
        {
            t.Join();
        }

        Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
        Console.ReadLine();
    }
}

これは簡単な例です.しかし、マルチスレッドの動作の原理を説明することができます(本人はマルチスレッドに触れたばかりで、もし間違っていたら、皆さんに注意してください~~~~).
まず、やはりその年の大学で学んだオペレーティングシステムの原理と結びつけて、基礎知識を話します.
1)プロセスとスレッド
簡単に言えば、1つのプログラムには少なくとも1つのプロセスがあり、1つのプロセスには少なくとも1つのスレッドがある.プロセスは、プログラムがオペレーティングシステムにリソースを申請する基本単位です.スレッドはオペレーティングシステムにリソースを申請できませんが、親プロセスが申請したリソースの一部を他のスレッドと一緒に利用できます.他のスレッドと一緒にリソースを使用するだけに、競合は必然的に発生します.ここでは衝突を解決するために,リソースをロック操作したり,同期ベースを制御したりするのが一般的である(これは後述するが,ここではスレッドの基礎知識に重点を置いて説明する).スレッドは、プロセスで実行される演算の基本単位です.
2)新規スレッドの作成
スレッドの作成と破棄は、別のスレッドで実行できます.例えば、UIスレッドは、あなたたちはすべて知っています~~~ガガ
3)マルチスレッドの実行
マルチスレッドプログラムを作成すると、マルチスレッドの実行方法を考える人が多いです.ここで、私は依然としてオペレーティングシステムの原理のあの授業の理論を引用します(ハハ~私をののしるな、皆さん.私たちの大学のオペレーティングシステムの原理は全国で有名で、あのおじいさんが私たちに講義してくれた本はすべて彼が自分で書いたもので、とても強いです).CPUは実際にはこのように動作し、システムが現在メンテナンスしているすべてのプロセスのスレッドは、デフォルトではCPUの実行時間を得る権利があります.ここでは、CPU実行時間とは何かを説明します.咳咳、実は、私たちが見たプログラムはずっと実行されています.例えばwindowsオペレーティングシステムの下でファイルをコピーすると、1ページの紙が1つのフォルダから別のフォルダに送られているようなアニメーションが表示されます.はい、私が言ったのはそれです.それはあなたが一貫した動作のように見えますが、実は彼は一貫していません.ただ、現代のコンピュータのハードウェア設備は本当に先進的で、CPUの処理速度が速すぎます.人間の肉眼ではその隙間はまったく見えない.では、この過程を説明します.オペレーティングシステムのすべてのスレッドはCPU上を走っています(一般的には数十以上、千以上のスレッドがありますが、それは普通です).これらのスレッドは、CPUを占有します.これは私が言うまでもありません(もちろん、メモリなどの他のシステムリソースも占有しています!).では、こんなに多くのスレッドがCPUを同時に占有しているのに、どうすればいいのでしょうか.そこで、オペレーティングシステムはCPUの占有量を多くのタイムスライスに分けます.各タイムスライスでスレッドが実行されます.このタイムスライスが過ぎると、実行したばかりのスレッドがCPUの実行から移動し、次のスレッドが入ります.このように往復して、システムメンテナンスのすべてのスレッドがCPUに割り当てられることを確保します.これがCPUタイムスライス(タイムホイールとも呼ばれる)です.(もちろん,先ほど述べたスレッドの交代でCPUタイムスライスを取得する過程では,現場保護などの複雑な操作にも関与しており,興味のある学生はオペレーティングシステムの原理をよく読むことができる.先ほどお話ししたように、デフォルトではシステム内の各スレッドがCPUのタイムスライスを取得する確率は同じですが、あるスレッドの重み値を変更して、実行優先度を高めることができます.このスレッドは他のスレッドよりもCPUがタイムスライスを実行する確率が高い.ええと、ちょっと深そうですね.まず,各スレッドの重み値が異なる場合にかかわらず,デフォルトの各スレッドの重み値は同じであり,CPUタイムホイールを得る確率は同じである.この場合,各スレッドは共にCPU上を走り,1つのスレッドが走ったタイムスライスが到着すると,CPUを取り出し,次のスレッドが入ってきて,各スレッドが交互にCPUを得る.上のプログラムの実行結果を見るとわかります.しかし、もし私がメインスレッドのsleepのコードをログアウトしたらどうなりますか?では、理論的には、メインスレッドのコードをすべて実行してから、新しいスレッドのコードを実行します.しかし、何度も実行して結果を見てみましょう.しかし、完全にそうではなく、実行の結果が異なることがわかりました.マイクロソフトの解釈は、子供靴の皆さん、これは正常な状況で、同じマルチスレッドプログラムはいくつかの小さな異なる実行結果が現れます.マルチスレッドのプログラムは誰も保証できず,実行結果はどのようなものであり,結果は予測できない.そのため、現代のプログラムではマルチスレッドの処理が必要ですが、やむを得ず、マルチスレッドを使用しないことをお勧めします.予知不可能で災難的な結果を招きやすいからです.