同時プログラミングで知らなければならないいくつかの概念
1988 ワード
同時プログラミングでは、次の概念が重要です.同期非同期 パラレル 臨界領域 閉塞と非閉塞 デッドロック、活鎖と飢餓
メソッド呼び出しに対して、同期はメソッドの実行が完了してから実行を継続し、非同期は呼び出し後すぐに戻り、メソッドの実行が完了するのを待たずに、新しいスレッドで実行されます.
あなたが店に買い物に行くように、品物がなくなったので、倉庫に行って荷物を取りに行かなければなりません.
同期方式であれば、店で待っていて、荷物を取り戻した後、荷物を持って離れます.
非同期方式であれば、待たずに配送先を残して行ってください.
彼らは同じ感じで、複数のタスクが一緒に実行されていますが、実際には違いがあります.並列は本当に一緒に実行され、同時に交互に実行され、同時に一緒に実行されているように感じられます.
シングルコアCPUは同時実行のみで、複数のタスクが交互に実行され、マルチコアが並列に実行されます.
臨界区は公共の共有資源であり、いずれも使用できるが、同じ時刻に一人でしか使用できず、他の人は待たなければならない.
例えば、会社のプリンタは臨界区で、同僚たちはそれを使ってファイルを印刷することができますが、一度に1部しか印刷できません.王さんは印刷しています.他の同僚は彼が終わるのを待たなければなりません.
臨界領域に対して、1つのスレッドが臨界領域資源を手に入れたので、他のスレッドがずっとそれを待っていたら、ブロックで、他のスレッドが等しくなければ、他のことを続けて、これは非ブロックです.
デッドロックはよく理解できて、スレッド1は資源Aを持っていて、スレッド2は資源Bを持っていて、それからスレッド1はBを持っていて、スレッド2はAを持っていて、すべて相手の資源が欲しくて、また自分の手の中の資源を放さないで、これは硬直しました.
デッドロックはスレッドがリソースを手に入れられず、待機状態にあり、動かなくなり、死んだように、デッドロックも待機リソースであるが、スレッドはアクティブな状態にあり、リソースが利用可能かどうかを再試行し続け、失敗した後も再試行を続け、デッドサイクルの状態である.
飢餓はスレッドが資源を手に入れられないことであり、その優先度が低すぎて、資源が高優先度のスレッドに奪われ続け、目を開けて飢え死にしたからだ.
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
}
);
飢餓はスレッドが資源を手に入れられないことであり、その優先度が低すぎて、資源が高優先度のスレッドに奪われ続け、目を開けて飢え死にしたからだ.