同時プログラミングで知らなければならないいくつかの概念

1988 ワード

同時プログラミングでは、次の概念が重要です.
  • 同期非同期
  • パラレル
  • 臨界領域
  • 閉塞と非閉塞
  • デッドロック、活鎖と飢餓
  • 1.同期と非同期


    メソッド呼び出しに対して、同期はメソッドの実行が完了してから実行を継続し、非同期は呼び出し後すぐに戻り、メソッドの実行が完了するのを待たずに、新しいスレッドで実行されます.
    あなたが店に買い物に行くように、品物がなくなったので、倉庫に行って荷物を取りに行かなければなりません.
    同期方式であれば、店で待っていて、荷物を取り戻した後、荷物を持って離れます.
    非同期方式であれば、待たずに配送先を残して行ってください.

    2.並行と同時


    彼らは同じ感じで、複数のタスクが一緒に実行されていますが、実際には違いがあります.並列は本当に一緒に実行され、同時に交互に実行され、同時に一緒に実行されているように感じられます.
    シングルコアCPUは同時実行のみで、複数のタスクが交互に実行され、マルチコアが並列に実行されます.

    3.臨界領域


    臨界区は公共の共有資源であり、いずれも使用できるが、同じ時刻に一人でしか使用できず、他の人は待たなければならない.
    例えば、会社のプリンタは臨界区で、同僚たちはそれを使ってファイルを印刷することができますが、一度に1部しか印刷できません.王さんは印刷しています.他の同僚は彼が終わるのを待たなければなりません.

    4.ブロックと非ブロック


    臨界領域に対して、1つのスレッドが臨界領域資源を手に入れたので、他のスレッドがずっとそれを待っていたら、ブロックで、他のスレッドが等しくなければ、他のことを続けて、これは非ブロックです.

    5.デッドロック、デッドロック、飢餓


    デッドロックはよく理解できて、スレッド1は資源Aを持っていて、スレッド2は資源Bを持っていて、それからスレッド1はBを持っていて、スレッド2はAを持っていて、すべて相手の資源が欲しくて、また自分の手の中の資源を放さないで、これは硬直しました.
    public void a_b() 
    {
        synchronized (res_a)
        {
            synchronized (res_b)
            {
                // ...
            }
        }
    }
    
    public void b_a() 
    {
        synchronized (res_b)
        {
            synchronized (res_a)
            {
                // ...
            }
        }
    }
    

    デッドロックはスレッドがリソースを手に入れられず、待機状態にあり、動かなくなり、死んだように、デッドロックも待機リソースであるが、スレッドはアクティブな状態にあり、リソースが利用可能かどうかを再試行し続け、失敗した後も再試行を続け、デッドサイクルの状態である.
    // Thread1 
    Thread.Start( ()=> { 
        
        while (true) { 
    
            if (!l1.Lock(1000)) { 
                continue; 
            } 
    
            if (!l2.Lock(1000)) { 
                continue; 
            } 
    
            // do some work 
        }
    ); 
    
    // Thread2 
    Thread.Start( ()=> { 
        
        while (true) { 
            
            if (!l2.Lock(1000)) { 
                continue; 
            } 
            
            if (!l1.Lock(1000)) { 
                continue; 
            } 
            
            // do some work 
        }
    ); 
    

    飢餓はスレッドが資源を手に入れられないことであり、その優先度が低すぎて、資源が高優先度のスレッドに奪われ続け、目を開けて飢え死にしたからだ.