เจเจ เจฆเฉเจเฉเจ เจเจฟ .Net เจตเจฟเฉฑเจ เจธเจฎเจเจพเจฒเฉ เจ เจคเฉ เจธเจฎเจพเจจเจพเจเจคเจฐ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเจฆเฉ เจนเฉ, เจเฉฑเจ เจเจฆเจพเจนเจฐเจฃ เจตเจเฉเจ เจซเจฟเจฒเจพเจธเจซเจฐเจธ เจกเจพเจเจจเจฟเฉฐเจ เจธเจฎเฉฑเจธเจฟเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเฉเจเฅค เจฏเฉเจเจจเจพ เจเจน เจนเฉ, เจฅเจฐเจฟเฉฑเจกเจพเจ / เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจฆเฉ เจธเจฎเจเจพเจฒเฉเจเจฐเจจ เจคเฉเจ, เจ เจญเจฟเจจเฉเจคเจพ เจฎเจพเจกเจฒ เจคเฉฑเจ (เจนเฉเจ เจฒเฉ เจญเจพเจเจพเจ เจตเจฟเฉฑเจ)เฅค เจฒเฉเจ เจชเจนเจฟเจฒเฉ เจเจพเจฃเฉ เจฒเจ เจเจพเจ เจคเฉเจนเจพเจกเฉ เจเจฟเจเจจ เจจเฉเฉฐ เจคเจพเจเจผเจพ เจเจฐเจจ เจฒเจ เจฒเจพเจญเจฆเจพเจเจ เจนเฉ เจธเจเจฆเจพ เจนเฉเฅค
เจเจน เจธเจญ เจเจฟเจเจ เจเจฐเจฆเฉ เจนเจจ? เจเจฐเจพเจเจเจผเจฟเจธเจเจฐ เจเจชเจฃเฉ เจเฉฑเจเฉ-เจเฉฑเจ เจเจเจพเจฐ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจเจพเจเจฆเฉ เจนเจจ, เจฎเฉเจฐ เจฆเจพ เจจเจฟเจฏเจฎ เจชเฉเจฐเจเจพเจธเจผ เจฆเฉ เจเจคเฉ เจฆเฉ เจธเฉเจฎเจพ 'เจคเฉ เจจเจฟเจฐเจญเจฐ เจเจฐเจฆเจพ เจนเฉ เจ เจคเฉ เจเจธเจฒเจ เจเจฟเจฃเจคเฉ เจตเจฟเฉฑเจ เจตเจพเจงเจพ เจฆเฉเจเจฟเจ เจเจพเจเจฆเจพ เจนเฉ, เจนเฉเจฐ เจเจฐเจพเจเจเจผเจฟเจธเจเจฐ เจฌเจฃเจพเจ เจเจพ เจธเจเจฆเฉ เจนเจจเฅค เจเจธเฉ เจธเจฎเฉเจ, เจกเฉเจเจพ เจฆเฉ เจฎเจพเจคเจฐเจพ เจตเจง เจฐเจนเฉ เจนเฉ, เจ เจคเฉ เจเจชเจญเฉเจเจคเจพ เจธเจฟเจธเจเจฎเจพเจ เจคเฉเจ เจคเฉเจฐเฉฐเจค เจเจตเจพเจฌ เจฆเฉ เจเจฎเฉเจฆ เจเจฐเจฆเฉ เจนเจจ. เจ เจเจฟเจนเฉ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ, "เจเจฎ" เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ, เจเจฆเฉเจ เจธเจพเจกเฉ เจเฉเจฒ เจเฉฑเจ เจเจเจเจผเฉเจเจฟเจเจเจฟเฉฐเจ เจฅเจฐเจฟเฉฑเจก เจนเฉเฉฐเจฆเจพ เจนเฉ, เจนเฉเจฃ เจชเฉเจฐเจญเจพเจตเฉ เจจเจนเฉเจ เจนเฉเฉฐเจฆเจพเฅค เจคเฉเจนเจพเจจเฉเฉฐ เจธเจฎเจเจพเจฒเฉ เจเจพเจ เจธเจฎเจเจพเจฒเฉ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจฆเฉ เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจเจฟเจธเฉ เจคเจฐเฉเจนเจพเจ เจนเฉฑเจฒ เจเจฐเจจ เจฆเฉ เจเจผเจฐเฉเจฐเจค เจนเฉ. เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจเจน เจธเจฎเฉฑเจธเจฟเจ เจตเฉฑเจ-เจตเฉฑเจ เจชเฉฑเจงเจฐเจพเจ 'เจคเฉ เจฎเฉเจเฉเจฆ เจนเฉ: เจฅเจฐเจฟเฉฑเจกเจพเจ เจฆเฉ เจชเฉฑเจงเจฐ 'เจคเฉ, เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจฆเฉ เจชเฉฑเจงเจฐ' เจคเฉ, เจจเฉเจเจตเจฐเจ (เจตเจฟเจคเจฐเจฟเจค เจชเฉเจฐเจฃเจพเจฒเฉเจเจ) เจตเจฟเฉฑเจ เจฎเจธเจผเฉเจจเจพเจ เจฆเฉ เจชเฉฑเจงเจฐ 'เจคเฉ. .NET เจเฉเจฒ เจ เจเจฟเจนเฉเจเจ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจจเฉเฉฐ เจเจฒเจฆเฉ เจ เจคเฉ เจเฉเจธเจผเจฒเจคเจพ เจจเจพเจฒ เจนเฉฑเจฒ เจเจฐเจจ เจฒเจ เจเฉฑเจ-เจเฉเจฃเจตเฉฑเจคเจพ, เจธเจฎเจพเจ-เจชเจฐเฉเจเจฃ เจตเจพเจฒเฉเจเจ เจคเจเจจเจพเจฒเฉเจเฉเจเจ เจนเจจเฅค
เจเจฆเฉเจธเจผ
เจเจกเจธเจเจฐ เจกเจฟเจเจเจธเจเฉเจฐเจพ เจจเฉ 1965 เจฆเฉ เจธเจผเฉเจฐเฉ เจตเจฟเฉฑเจ เจเจชเจฃเฉ เจตเจฟเจฆเจฟเจเจฐเจฅเฉเจเจ เจจเฉเฉฐ เจเจน เจธเจฎเฉฑเจธเจฟเจ เจชเฉเจธเจผ เจเฉเจคเฉ เจธเฉเฅค เจธเจฅเจพเจชเจฟเจค เจซเจพเจฐเจฎเฉเจฒเฉ เจเจธ เจคเจฐเฉเจนเจพเจ เจนเฉเฅค เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจฆเฉ เจเฉฑเจ เจจเจฟเจธเจผเจเจฟเจค (เจเจฎ เจคเฉเจฐ 'เจคเฉ เจชเฉฐเจ) เจเจฟเจฃเจคเฉ เจนเฉ เจ เจคเฉ เจเจพเจเจเฉ เจฆเฉ เจเฉฑเจเฉ เจเจฟเจนเฉ เจเจฟเจฃเจคเฉ เจนเฉเฅค เจเจน เจเฉฑเจ เจเฉเจฒ เจฎเฉเจเจผ 'เจคเฉ เจฌเฉเจ เจฆเฉ เจนเจจ, เจเจจเฉเจนเจพเจ เจฆเฉ เจตเจฟเจเจเจพเจฐ เจเจพเจเจเฉ เจนเฉเฉฐเจฆเฉ เจนเจจ. เจซเจฟเจฒเจพเจธเจซเจฐ เจฌเฉเจ เฉฐเจค เจญเฉเจเจจ เจฆเฉเจเจ เจชเจฒเฉเจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเจพ เจธเจเจฆเฉ เจนเจจ, เจธเฉเจ เจธเจเจฆเฉ เจนเจจ เจเจพเจ เจเจกเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจจเฅค เจเฉฑเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจจเฉเฉฐ เจเจพเจฃ เจฒเจ, เจคเฉเจนเจพเจจเฉเฉฐ เจฆเฉ เจเจพเจเจเฉ เจฒเฉเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉ (เจเจเจฐเฉ เจเฉฑเจ เจเจพเจเจเฉ เจจเฉเฉฐ เจชเจนเจฟเจฒเฉ เจจเจพเจฒ เจธเจพเจเจเจพ เจเจฐเจฆเจพ เจนเฉ)เฅค เจซเฉเจฐเจ เจจเฉเฉฐ เจเฉเฉฑเจเจฃเจพ เจ เจคเฉ เจนเฉเจ เจพเจ เจฐเฉฑเจเจฃเจพ เจฆเฉ เจตเฉฑเจเจฐเฉเจเจ เจเจพเจฐเจตเจพเจเจเจ เจนเจจเฅค เจธเจพเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจเฉเฉฑเจช เจนเจจเฅค เจเฉฐเจฎ เจ เจเจฟเจนเจพ เจเจฒเจเฉเจฐเจฟเจฅเจฎ เจฒเฉฑเจญเจฃ เจฆเจพ เจนเฉ เจเจฟ เจธเจพเจฐเฉ 54 เจธเจพเจฒเจพเจ เจฌเจพเจ เจฆ เจตเฉ เจธเฉเจเจฃเจเฉ เจ เจคเฉ เจชเฉเจฐเฉ เจนเฉเจฃเจเฉเฅค
เจชเจนเจฟเจฒเจพเจ, เจเจ เจธเจพเจเจเฉ เจฅเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเจธ เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจนเฉฑเจฒ เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจเฅค เจเจพเจเจเฉ เจธเจพเจเจเฉ เจฎเฉเจเจผ 'เจคเฉ เจชเจ เจนเฉเฉฐเจฆเฉ เจนเจจ เจ เจคเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจเจจเฉเจนเจพเจ เจจเฉเฉฐ เจเจฆเฉเจ เจฒเฉเจเจฆเฉ เจนเจจ เจเจฆเฉเจ เจเจน เจนเฉเฉฐเจฆเฉ เจนเจจ เจ เจคเฉ เจเจจเฉเจนเจพเจ เจจเฉเฉฐ เจตเจพเจชเจธ เจชเจพ เจฆเจฟเฉฐเจฆเฉ เจนเจจเฅค เจเฉฑเจฅเฉ เจธเจฟเฉฐเจเฉเจฐเฉเจจเจพเจเจเจผเฉเจธเจผเจจ เจจเจพเจฒ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ เจนเจจ, เจฏเจเฉเจจเฉ เจคเฉเจฐ 'เจคเฉ เจเจฆเฉเจ เจฒเฉเจฃเจพ เจนเฉ? เจเฉ เจเฉเจ เจเจพเจเจเจพ เจจเจนเฉเจ เจนเฉ เจคเจพเจ เจเฉ เจนเฉเจตเฉเจเจพ? เจเจฆเจฟ เจชเจฐ เจชเจนเจฟเจฒเจพเจ, เจเจ เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจฆเฉ เจธเจผเฉเจฐเฉเจเจค เจเจฐเฉเจเฅค
เจฅเจฐเจฟเฉฑเจก เจธเจผเฉเจฐเฉ เจเจฐเจจ เจฒเจ, เจ
เจธเฉเจ เจฅเจฐเจฟเฉฑเจก เจชเฉเจฒ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ Task.Run
เจตเจฟเจงเฉ:
var cancelTokenSource = new CancellationTokenSource();
Action<int> create = (i) => RunPhilosopher(i, cancelTokenSource.Token);
for (int i = 0; i < philosophersAmount; i++)
{
int icopy = i;
// ะะพะผะตััะธัั ะทะฐะดะฐัั ะฒ ะพัะตัะตะดั ะฟัะปะฐ ะฟะพัะพะบะพะฒ. ะะตัะพะด RunDeadlock ะฝะต ะทะฐะฟััะบะฐะตัััั
// ััะฐะทั, ะฐ ะถะดะตั ัะฒะพะตะณะพ ะฟะพัะพะบะฐ. ะัะธะฝั
ัะพะฝะฝัะน ะทะฐะฟััะบ.
philosophers[i] = Task.Run(() => create(icopy), cancelTokenSource.Token);
}
เจฅเจฐเจฟเฉฑเจก เจชเฉเจฒ เจจเฉเฉฐ เจฅเจฐเจฟเฉฑเจก เจฌเจฃเจพเจเจฃ เจ
เจคเฉ เจฎเจฟเจเจพเจเจฃ เจจเฉเฉฐ เจ
เจจเฉเจเฉเจฒ เจฌเจฃเจพเจเจฃ เจฒเจ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจเจธ เจชเฉเจฒ เจตเจฟเฉฑเจ เจเจพเจฐเจเจพเจ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจเจคเจพเจฐ เจนเฉ เจ
เจคเฉ CLR เจเจนเจจเจพเจ เจเจพเจฐเจเจพเจ เจฆเฉ เจธเฉฐเจเจฟเจ เจฆเฉ เจ
เจงเจพเจฐ 'เจคเฉ เจฅเจฐเจฟเฉฑเจก เจฌเจฃเจพเจเจเจฆเจพ เจเจพเจ เจนเจเจพเจเจเจฆเจพ เจนเฉเฅค เจธเจพเจฐเฉ AppDomains เจฒเจ เจเฉฑเจ เจชเฉเจฒเฅค เจเจน เจชเฉเจฒ เจฒเจเจญเจ เจนเจฎเฉเจธเจผเจพ เจตเจฐเจคเจฟเจ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ, เจเจฟเจเจเจเจฟ. เจงเจพเจเฉ เจฌเจฃเจพเจเจฃ, เจฎเจฟเจเจพเจเจฃ, เจเจนเจจเจพเจ เจฆเฉเจเจ เจเจคเจพเจฐเจพเจ เจเจฆเจฟ เจจเจพเจฒ เจชเจฐเฉเจธเจผเจพเจจ เจนเฉเจฃ เจฆเฉ เจเฉเจ เจฒเฉเฉ เจจเจนเฉเจเฅค เจเจน เจชเฉเจฒ เจคเฉเจ เจฌเจฟเจจเจพเจ เจธเฉฐเจญเจต เจนเฉ, เจชเจฐ เจซเจฟเจฐ เจคเฉเจนเจพเจจเฉเฉฐ เจเจธเจจเฉเฉฐ เจธเจฟเฉฑเจงเจพ เจตเจฐเจคเจฃเจพ เจชเจตเฉเจเจพ Thread
, เจเจน เจเจนเจจเจพเจ เจเฉเจธเจพเจ เจฒเจ เจฒเจพเจญเจฆเจพเจเจ เจนเฉ เจเจฆเฉเจ เจคเฉเจนเจพเจจเฉเฉฐ เจเจฟเจธเฉ เจฅเฉเจฐเฉเฉฑเจก เจฆเฉ เจคเจฐเจเฉเจน เจจเฉเฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ, เจเจฆเฉเจ เจธเจพเจกเฉ เจเฉเจฒ เจเฉฑเจ เจฒเฉฐเจฎเฉ เจเจพเจฐเจตเจพเจ เจนเฉเฉฐเจฆเฉ เจนเฉ, เจเฉฑเจ เจซเฉเจฐเจเจฐเจพเจเจเจก เจฅเจฐเจฟเฉฑเจก เจฒเจ, เจเจฆเจฟเฅค
เจนเฉเจฐ เจธเจผเจฌเจฆเจพเจ เจตเจฟเจ, System.Threading.Tasks.Task
เจเจฒเจพเจธ เจเฉฑเจเฉ เจนเฉ เจนเฉ Thread
, เจชเจฐ เจนเจฐ เจคเจฐเฉเจนเจพเจ เจฆเฉเจเจ เจธเฉเจตเจฟเจงเจพเจตเจพเจ เจฆเฉ เจจเจพเจฒ: เจนเฉเจฐ เจเฉฐเจฎเจพเจ เจฆเฉ เจเฉฑเจ เจฌเจฒเจพเจ เจฆเฉ เจฌเจพเจ
เจฆ เจเฉฑเจ เจเฉฐเจฎ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฆเฉ เจธเจฎเจฐเฉฑเจฅเจพ, เจเจนเจจเจพเจ เจจเฉเฉฐ เจซเฉฐเจเจธเจผเจจเจพเจ เจคเฉเจ เจตเจพเจชเจธ เจเจฐเจจเจพ, เจเจนเจจเจพเจ เจจเฉเฉฐ เจธเฉเจตเจฟเจงเจพเจเจจเจ เจฐเฉเจช เจตเจฟเฉฑเจ เจตเจฟเจเจจ เจชเจพเจเจฃเจพ, เจ
เจคเฉ เจนเฉเจฐ เจฌเจนเฉเจค เจเฉเจเฅค เจเจฆเจฟเฅค เจเจนเจจเจพเจ เจจเฉเฉฐ เจ
เจธเจฟเฉฐเจ/เจตเฉเจ เจเฉฐเจธเจเฉเจฐเจเจธเจผเจจ (เจเจพเจธเจ-เจ
เจงเจพเจฐเจฟเจค เจ
เจธเจฟเฉฐเจเจฐเฉเจจเจธ เจชเฉเจเจฐเจจ, IO เจเจชเจฐเฉเจธเจผเจจเจพเจ เจฆเฉ เจเจกเฉเจ เจเจฐเจจ เจฒเจ เจธเจฟเฉฐเจเฉเจเจเจฟเจ เจธเจผเฉเจเจฐ) เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจจ เจฒเจ เจฒเฉเฉเฉเจเจฆเจพ เจนเฉเฅค เจ
เจธเฉเจ เจเจธ เจฌเจพเจฐเฉ เจฌเจพเจ
เจฆ เจตเจฟเฉฑเจ เจเฉฑเจฒ เจเจฐเจพเจเจเฉเฅค
CancelationTokenSource
เจเฉฑเจฅเฉ เจเจธเจฆเฉ เจฒเฉเฉ เจนเฉ เจคเจพเจ เจเจฟ เจเจพเจฒเจฟเฉฐเจ เจฅเจฐเจฟเฉฑเจก เจฆเฉ เจธเจฟเจเจจเจฒ 'เจคเฉ เจฅเจฐเจฟเฉฑเจก เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจเจคเจฎ เจเจฐ เจธเจเฉเฅค
เจธเจฎเจเจพเจฒเฉเจเจฐเจจ เจธเจฎเฉฑเจธเจฟเจเจตเจพเจ
เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจจเฉเฉฐ เจฌเจฒเฉเจ เจเฉเจคเจพ
เจ เฉเจ เจนเฉ, เจ เจธเฉเจ เจเจพเจฃเจฆเฉ เจนเจพเจ เจเจฟ เจงเจพเจเฉ เจเจฟเจตเฉเจ เจฌเจฃเจพเจเจฃเฉ เจนเจจ, เจเจ เจฆเฉเจชเจนเจฟเจฐ เจฆเฉ เจเจพเจฃเฉ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจ:
// ะัะพ ะบะฐะบะธะต ะฒะธะปะบะธ ะฒะทัะป. ะ ะฟัะธะผะตัั: 1 1 3 3 - 1ะน ะธ 3ะน ะฒะทัะปะธ ะฟะตัะฒัะต ะดะฒะต ะฟะฐัั.
private int[] forks = Enumerable.Repeat(0, philosophersAmount).ToArray();
// ะขะพ ะถะต, ััะพ RunPhilosopher()
private void RunDeadlock(int i, CancellationToken token)
{
// ะะดะฐัั ะฒะธะปะบั, ะฒะทััั ะตั. ะญะบะฒะธะฒะฐะปะตะฝัะฝะพ:
// while(true)
// if forks[fork] == 0
// forks[fork] = i+1
// break
// Thread.Sleep() ะธะปะธ Yield() ะธะปะธ SpinWait()
void TakeFork(int fork) =>
SpinWait.SpinUntil(() =>
Interlocked.CompareExchange(ref forks[fork], i+1, 0) == 0);
// ะะปั ะฟัะพััะพัั, ะฝะพ ะผะพะถะฝะพ ั Interlocked.Exchange:
void PutFork(int fork) => forks[fork] = 0;
while (true)
{
TakeFork(Left(i));
TakeFork(Right(i));
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
PutFork(Left(i));
PutFork(Right(i));
Think(i);
// ะะฐะฒะตััะธัั ัะฐะฑะพัั ะฟะพ-ั
ะพัะพัะตะผั.
token.ThrowIfCancellationRequested();
}
}
เจเฉฑเจฅเฉ เจ
เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจเฉฑเจฌเจพ เจเจพเจเจเจพ, เจ
เจคเฉ เจซเจฟเจฐ เจธเฉฑเจเจพ เจเจพเจเจเจพ เจฒเฉเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเฉ เจนเจพเจ, เจ
เจคเฉ เจเฉ เจเจน เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉ, เจคเจพเจ เจ
เจธเฉเจ เจเจจเฉเจนเจพเจ เจจเฉเฉฐ เจเจพ เจเฉ เจตเจพเจชเจธ เจฐเฉฑเจ เจฆเจฟเฉฐเจฆเฉ เจนเจพเจเฅค เจเฉฑเจ เจเจพเจเจเจพ เจฒเฉเจฃเจพ เจชเจฐเจฎเจพเจฃเฉ เจนเฉ, เจฏเจพเจจเฉ. เจฆเฉ เจฅเจฐเจฟเฉฑเจก เจเฉฑเจเฉ เจธเจฎเฉเจ เจเฉฑเจ เจจเจนเฉเจ เจฒเฉ เจธเจเจฆเฉ (เจเจฒเจค: เจชเจนเจฟเจฒเจพ เจชเฉเฉเจนเจฆเจพ เจนเฉ เจเจฟ เจซเฉเจฐเจ เจฎเฉเจซเจค เจนเฉ, เจฆเฉเจเจพ - เจตเฉ, เจชเจนเจฟเจฒเจพ เจฒเฉเจเจฆเจพ เจนเฉ, เจฆเฉเจเจพ เจฒเฉเจเจฆเจพ เจนเฉ)เฅค เจเจธ เจฒเจ Interlocked.CompareExchange
, เจเจฟเจธ เจจเฉเฉฐ เจชเฉเจฐเฉเจธเฉเจธเจฐ เจนเจฆเจพเจเจค เจจเจพเจฒ เจฒเจพเจเฉ เจเฉเจคเจพ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ (TSL
, XCHG
), เจเฉ เจชเจฐเจฎเจพเจฃเฉ เจเฉเจฐเจฎเจตเจพเจฐ เจชเฉเฉเจนเจจ เจ
เจคเฉ เจฒเจฟเจเจฃ เจฒเจ เจฎเฉเจฎเฉเจฐเฉ เจฆเฉ เจเฉฑเจ เจเฉเจเฉเฉ เจจเฉเฉฐ เจฒเจพเจ เจเจฐเจฆเจพ เจนเฉเฅค เจ
เจคเฉ SpinWait เจจเจฟเจฐเจฎเจพเจฃ เจฆเฉ เจฌเจฐเจพเจฌเจฐ เจนเฉ while(true)
เจธเจฟเจฐเจซ เจฅเฉเฉเฉ เจเจฟเจนเฉ "เจเจพเจฆเฉ" เจจเจพเจฒ - เจงเจพเจเจพ เจชเฉเจฐเฉเจธเฉเจธเจฐ เจฒเฉเจเจฆเจพ เจนเฉ (Thread.SpinWait
), เจชเจฐ เจเจ เจตเจพเจฐ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจจเฉเฉฐ เจเจฟเจธเฉ เจนเฉเจฐ เจฅเฉเจฐเฉเจก เจตเจฟเฉฑเจ เจคเจฌเจฆเฉเจฒ เจเจฐ เจฆเจฟเฉฐเจฆเจพ เจนเฉ (Thread.Yeild
) เจเจพเจ เจธเฉเจ เจเจพเจเจฆเจพ เจนเฉ (Thread.Sleep
).
เจชเจฐ เจเจน เจนเฉฑเจฒ เจเฉฐเจฎ เจจเจนเฉเจ เจเจฐเจฆเจพ, เจเจฟเจเจเจเจฟ เจชเฉเจฐเจตเจพเจน เจเจฒเจฆเฉ เจนเฉ (เจฎเฉเจฐเฉ เจฒเจ เจเฉฑเจ เจธเจเจฟเฉฐเจ เจฆเฉ เจ เฉฐเจฆเจฐ) เจฌเฉฐเจฆ เจนเฉ เจเจพเจเจฆเฉ เจนเจจ: เจธเจพเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจเจชเจฃเจพ เจเฉฑเจฌเจพ เจเจพเจเจเจพ เจฒเฉเจเจฆเฉ เจนเจจ, เจชเจฐ เจธเฉฑเจเจพ เจจเจนเฉเจเฅค เจซเฉเจฐเจ เจเจฐเฉ เจฆเฉ เจซเจฟเจฐ เจฎเฉเฉฑเจฒ เจนเจจ: 1 2 3 4 5เฅค
เจเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจ, เจฌเจฒเจพเจเจฟเฉฐเจ เจฅเจฐเจฟเฉฑเจก (เจกเฉเฉฑเจกเจฒเจพเจ)เฅค เจเฉเจฐเฉเจจ - เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ, เจฒเจพเจฒ - เจธเจฟเฉฐเจเฉเจฐเฉเจจเจพเจเจเจผเฉเจธเจผเจจ, เจธเจฒเฉเจเฉ - เจฅเจฐเจฟเฉฑเจก เจธเฉเฉฑเจคเจพ เจนเฉเจเจ เจนเฉ. เจฐเฉเจฎเจฌเจธ เจเจพเจธเจ เจฆเฉ เจธเจผเฉเจฐเฉเจเจคเฉ เจธเจฎเฉเจ เจจเฉเฉฐ เจฆเจฐเจธเจพเจเจเจฆเฉ เจนเจจเฅค
เจซเจฟเจฒเจพเจธเจซเจฐเจพเจ เจฆเฉ เจญเฉเฉฑเจ
เจนเจพเจฒเจพเจเจเจฟ เจเจพเจธ เจคเฉเจฐ 'เจคเฉ เจฌเจนเฉเจคเจพ เจญเฉเจเจจ เจธเฉเจเจฃเจพ เจเจผเจฐเฉเจฐเฉ เจจเจนเฉเจ เจนเฉ, เจชเจฐ เจญเฉเฉฑเจ เจเจฟเจธเฉ เจจเฉเฉฐ เจตเฉ เจซเจฒเจธเจซเฉ เจจเฉเฉฐ เจเฉฑเจก เจฆเจฟเฉฐเจฆเฉ เจนเฉเฅค เจเจ เจธเจพเจกเฉ เจธเจฎเฉฑเจธเจฟเจ เจตเจฟเฉฑเจ เจฅเจฐเจฟเฉฑเจกเจพเจ เจฆเฉ เจญเฉเฉฑเจเจฎเจฐเฉ เจฆเฉ เจธเจฅเจฟเจคเฉ เจฆเฉ เจจเจเจฒ เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเฉเจ. เจญเฉเฉฑเจเจฎเจฐเฉ เจเจฆเฉเจ เจนเฉเฉฐเจฆเฉ เจนเฉ เจเจฆเฉเจ เจเฉฑเจ เจงเจพเจเจพ เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจชเจฐ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจเฉฐเจฎ เจฆเฉ เจฌเจฟเจจเจพเจ, เจฆเฉเจเฉ เจธเจผเจฌเจฆเจพเจ เจตเจฟเฉฑเจ, เจเจน เจเจนเฉ เจกเฉเฉฑเจกเจฒเจพเจ เจนเฉ, เจธเจฟเจฐเจซ เจนเฉเจฃ เจงเจพเจเจพ เจธเฉเฉฑเจคเจพ เจจเจนเฉเจ เจนเฉ, เจชเจฐ เจธเจฐเจเจฐเจฎเฉ เจจเจพเจฒ เจเจพเจฃ เจฒเจ เจเฉเจ เจฒเฉฑเจญ เจฐเจฟเจนเจพ เจนเฉ, เจชเจฐ เจเฉเจ เจญเฉเจเจจ เจจเจนเฉเจ เจนเฉ. เจตเจพเจฐ-เจตเจพเจฐ เจฌเจฒเจพเจเจฟเฉฐเจ เจคเฉเจ เจฌเจเจฃ เจฒเจ, เจเฉเจเจฐ เจ เจธเฉเจ เจเฉเจ เจนเฉเจฐ เจจเจนเฉเจ เจฒเฉ เจธเจเจฆเฉ เจคเจพเจ เจ เจธเฉเจ เจซเฉเจฐเจ เจจเฉเฉฐ เจตเจพเจชเจธ เจฐเฉฑเจ เจฆเจฟเจเจเจเฉเฅค
// ะขะพ ะถะต ััะพ ะธ ะฒ RunDeadlock, ะฝะพ ัะตะฟะตัั ะบะปะฐะดะตะผ ะฒะธะปะบั ะฝะฐะทะฐะด ะธ ะดะพะฑะฐะฒะปัะตะผ ะฟะปะพั
ะธั
ัะธะปะพัะพัะพะฒ.
private void RunStarvation(int i, CancellationToken token)
{
while (true)
{
bool hasTwoForks = false;
var waitTime = TimeSpan.FromMilliseconds(50);
// ะะปะพั
ะพะน ัะธะปะพัะพัะพะฒ ะผะพะถะตั ัะถะต ะธะผะตัั ะฒะธะปะบั:
bool hasLeft = forks[Left(i)] == i + 1;
if (hasLeft || TakeFork(Left(i), i + 1, waitTime))
{
if (TakeFork(Right(i), i + 1, TimeSpan.Zero))
hasTwoForks = true;
else
PutFork(Left(i)); // ะะฝะพะณะดะฐ ะฟะปะพั
ะพะน ัะธะปะพัะพั ะพัะดะฐะตั ะฒะธะปะบั ะฝะฐะทะฐะด.
}
if (!hasTwoForks)
{
if (token.IsCancellationRequested) break;
continue;
}
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
bool goodPhilosopher = i % 2 == 0;
// ะ ะฟะปะพั
ะพะน ัะธะปะพัะพั ะทะฐะฑัะฒะฐะตั ะฟะพะปะพะถะธัั ัะฒะพั ะฒะธะปะบั ะพะฑัะฐัะฝะพ:
if (goodPhilosopher)
PutFork(Left(i));
// ะ ะตัะปะธ ะธ ะฟัะฐะฒัั ะฝะต ะฟะพะปะพะถะธั, ัะพ ั
ะพัะพัะธะต ะฑัะดัั ะฒะพะพะฑัะต ะฑะตะท ะตะดั.
PutFork(Right(i));
Think(i);
if (token.IsCancellationRequested)
break;
}
}
// ะขะตะฟะตัั ะผะพะถะฝะพ ะถะดะฐัั ะพะฟัะตะดะตะปะตะฝะฝะพะต ะฒัะตะผั.
bool TakeFork(int fork, int philosopher, TimeSpan? waitTime = null)
{
return SpinWait.SpinUntil(
() => Interlocked.CompareExchange(ref forks[fork], philosopher, 0) == 0,
waitTime ?? TimeSpan.FromMilliseconds(-1)
);
}
เจเจธ เจเฉเจก เจฆเฉ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจเฉฑเจฒ เจเจน เจนเฉ เจเจฟ เจเจพเจฐ เจตเจฟเฉฑเจเฉเจ เจฆเฉ เจซเจฟเจฒเจพเจธเจซเจฐ เจเจชเจฃเจพ เจเฉฑเจฌเจพ เจเจพเจเจเจพ เจนเฉเจ เจพเจ เจฐเฉฑเจเจฃเจพ เจญเฉเฉฑเจฒ เจเจพเจเจฆเฉ เจนเจจเฅค เจ เจคเฉ เจเจน เจชเจคเจพ เจเจฒเจฆเจพ เจนเฉ เจเจฟ เจเจน เจตเจงเฉเจฐเฉ เจญเฉเจเจจ เจเจพเจเจฆเฉ เจนเจจ, เจเจฆเฉเจ เจเจฟ เจฆเฉเจธเจฐเฉ เจญเฉเฉฑเจเฉ เจฎเจฐเจจเจพ เจธเจผเฉเจฐเฉ เจเจฐ เจฆเจฟเฉฐเจฆเฉ เจนเจจ, เจนเจพเจฒเจพเจเจเจฟ เจฅเจฐเจฟเฉฑเจกเจพเจ เจฆเฉ เจเฉฑเจเฉ เจเจฟเจนเฉ เจคเจฐเจเฉเจน เจนเฉเฉฐเจฆเฉ เจนเฉ. เจเฉฑเจฅเฉ เจเจน เจชเฉเจฐเฉ เจคเจฐเฉเจนเจพเจ เจญเฉเฉฑเจเฉ เจจเจนเฉเจ เจนเจจ, เจเจฟเจเจเจเจฟ. เจฎเจพเฉเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจเจฆเฉ-เจเจฆเฉ เจเจชเจฃเฉ เจเจพเจเจเฉ เจตเจพเจชเจธ เจฐเฉฑเจเจฆเฉ เจนเจจเฅค เจเจน เจชเจคเจพ เจเจฒเจฆเจพ เจนเฉ เจเจฟ เจเฉฐเจเฉ เจฒเฉเจ เจฌเฉเจฐเฉ เจฒเฉเจเจพเจ เจจเจพเจฒเฉเจ เจฒเจเจญเจ 5 เจเฉเจฃเจพ เจเฉฑเจ เจเจพเจเจฆเฉ เจนเจจเฅค เจเจธ เจฒเจ เจเฉเจก เจตเจฟเฉฑเจ เจเฉฑเจ เจเฉเจเฉ เจเจฟเจนเฉ เจเจฒเจคเฉ เจเจพเจฐเจเฉเจเจผเจพเจฐเฉ เจตเจฟเฉฑเจ เจเจฟเจฐเจพเจตเจ เจตเฉฑเจฒ เจเฉเจฆเฉ เจนเฉ. เจเฉฑเจฅเฉ เจเจน เจตเฉ เจงเจฟเจเจจ เจฆเฉเจฃ เจฏเฉเจ เจนเฉ เจเจฟ เจเฉฑเจ เจฆเฉเจฐเจฒเฉฑเจญ เจธเจฅเจฟเจคเฉ เจธเฉฐเจญเจต เจนเฉ เจเจฆเฉเจ เจธเจพเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจเฉฑเจฌเจพ เจเจพเจเจเจพ เจฒเฉเจเจฆเฉ เจนเจจ, เจเฉเจ เจตเฉ เจธเฉฑเจเจพ เจจเจนเฉเจ เจนเฉเฉฐเจฆเจพ, เจเจน เจเฉฑเจฌเฉ เจชเจพเจธเฉ เจฐเฉฑเจเจฆเฉ เจนเจจ, เจเจกเฉเจ เจเจฐเจฆเฉ เจนเจจ, เจเฉฑเจฌเฉ เจชเจพเจธเฉ เจจเฉเฉฐ เจฒเฉเจเจฆเฉ เจนเจจ, เจเจฆเจฟเฅค เจเจน เจธเจฅเจฟเจคเฉ เจเฉฑเจ เจญเฉเฉฑเจเจฎเจฐเฉ เจตเฉ เจนเฉ, เจเฉฑเจ เจกเฉเฉฑเจกเจฒเจพเจ เจตเจฐเจเฉ. เจฎเฉเจ เจเจธเจจเฉเฉฐ เจฆเฉเจนเจฐเจพเจเจฃ เจตเจฟเฉฑเจ เจ เจธเจซเจฒ เจฐเจฟเจนเจพเฅค เจนเฉเจ เจพเจ เจเฉฑเจ เจ เจเจฟเจนเฉ เจธเจฅเจฟเจคเฉ เจฒเจ เจเฉฑเจ เจคเจธเจตเฉเจฐ เจนเฉ เจเจฟเฉฑเจฅเฉ เจฆเฉ เจฌเฉเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจจเฉ เจฆเฉเจจเฉ เจเจพเจเจเฉ เจฒเจ เจนเจจ เจ เจคเฉ เจฆเฉ เจเฉฐเจเฉ เจญเฉเฉฑเจเฉ เจฎเจฐ เจฐเจนเฉ เจนเจจเฅค
เจเฉฑเจฅเฉ เจคเฉเจธเฉเจ เจฆเฉเจ เจธเจเจฆเฉ เจนเฉ เจเจฟ เจฅเจฐเจฟเฉฑเจก เจเจ เจตเจพเจฐ เจเจพเจเจฆเฉ เจนเจจ เจ เจคเฉ เจธเจฐเฉเจค เจชเฉเจฐเจพเจชเจค เจเจฐเจจ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเฉ เจนเจจ. เจเจพเจฐ เจเฉเจฐเจพเจ เจตเจฟเฉฑเจเฉเจ เจฆเฉ เจเฉเจ เจจเจนเฉเจ เจเจฐเจฆเฉ (เจเจชเจฐเฉเจเจค เจนเจฐเจพ เจเฉเจฐเจพเจซ)เฅค
เจเฉฑเจ เจซเจฟเจฒเจพเจธเจซเจฐ เจฆเฉ เจฎเฉเจค
เจเฉเจฐ, เจเฉฑเจ เจนเฉเจฐ เจธเจฎเฉฑเจธเจฟเจ เจเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจฆเฉ เจธเจผเจพเจจเจฆเจพเจฐ เจฐเจพเจค เจฆเฉ เจเจพเจฃเฉ เจตเจฟเฉฑเจ เจตเจฟเจเจจ เจชเจพ เจธเจเจฆเฉ เจนเฉ เจเจน เจนเฉ เจเฉเจเจฐ เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจ
เจเจพเจจเจ เจเจธเจฆเฉ เจนเฉฑเจฅเจพเจ เจตเจฟเฉฑเจ เจเจพเจเจเฉ เจจเจพเจฒ เจฎเจฐ เจเจพเจเจฆเจพ เจนเฉ (เจ
เจคเฉ เจเจน เจเจธเจจเฉเฉฐ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเจซเจจเจพเจเจฃเจเฉ)เฅค เจซเจฟเจฐ เจเฉเจเจเจขเฉเจเจ เจจเฉเฉฐ เจฐเจพเจค เจฆเฉ เจเจพเจฃเฉ เจคเฉเจ เจฌเจฟเจจเจพเจ เจเฉฑเจก เจฆเจฟเฉฑเจคเจพ เจเจพเจตเฉเจเจพ. เจคเฉเจธเฉเจ เจเจชเจฃเฉ เจเจช เจจเฉเฉฐ เจเจธ เจเฉเจธ เจฒเจ เจเฉฑเจ เจเจฆเจพเจนเจฐเจจ เจเฉเจก เจฆเฉ เจจเจพเจฒ เจ เจธเจเจฆเฉ เจนเฉ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจธเจจเฉเฉฐ เจฌเจพเจนเจฐ เจธเฉเฉฑเจ เจฆเจฟเฉฑเจคเจพ เจเจฟเจ เจนเฉ NullReferenceException
เจฆเจพเจฐเจธเจผเจจเจฟเจ เจฆเฉ เจเจพเจเจเฉ เจฒเฉเจฃ เจคเฉเจ เจฌเจพเจ
เจฆ. เจ
เจคเฉ, เจคเจฐเฉเจเฉ เจจเจพเจฒ, เจ
เจชเจตเจพเจฆ เจจเฉเฉฐ เจธเฉฐเจญเจพเจฒเจฟเจ เจจเจนเฉเจ เจเจพเจตเฉเจเจพ เจ
เจคเฉ เจเจพเจฒเจฟเฉฐเจ เจเฉเจก เจธเจฟเจฐเจซ เจเจธ เจจเฉเฉฐ เจจเจนเฉเจ เจซเฉเฉเจเจพ (เจเจธ เจฒเจ AppDomain.CurrentDomain.UnhandledException
เจ
เจคเฉ เจเจฆเจฟ)เฅค เจเจธ เจฒเจ, เจฅเจฐเจฟเฉฑเจกเจพเจ เจตเจฟเฉฑเจ เจเจชเจฃเฉ เจเจช เจตเจฟเฉฑเจ เจ
เจคเฉ เจธเจผเจพเจจเจฆเจพเจฐ เจธเจฎเจพเจชเจคเฉ เจฆเฉ เจจเจพเจฒ เจเจฒเจคเฉ เจนเฉเจเจกเจฒเจฐ เจฆเฉ เจฒเฉเฉ เจนเฉเฉฐเจฆเฉ เจนเฉเฅค
เจตเฉเจเจฐ
เจ เฉเจ เจนเฉ, เจ เจธเฉเจ เจเจธ เจกเฉเฉฑเจกเจฒเจพเจ, เจญเฉเฉฑเจเจฎเจฐเฉ เจ เจคเฉ เจฎเฉเจค เจฆเฉ เจธเจฎเฉฑเจธเจฟเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจนเฉฑเจฒ เจเจฐ เจธเจเจฆเฉ เจนเจพเจ? เจ เจธเฉเจ เจธเจฟเจฐเจซ เจเฉฑเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจจเฉเฉฐ เจเจพเจเจเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเฉเจตเจพเจเจเฉ, เจเจธ เจธเจฅเจพเจจ เจฒเจ เจฅเจฐเจฟเฉฑเจกเจพเจ เจฆเฉ เจเฉฑเจ เจเจชเจธเฉ เจฌเฉเจฆเจเจฒเฉ เจเฉเฉเฉ. เจเจน เจเจฟเจตเฉเจ เจเจฐเจจเจพ เจนเฉ? เจฎเฉฐเจจ เจฒเจ เจเจฟ เจเฉฑเจ เจตเฉเจเจฐ เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจฆเฉ เจเฉเจฒ เจเฉเฉเจนเจพ เจนเฉ, เจเฉ เจเจฟเจธเฉ เจเฉฑเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจจเฉเฉฐ เจเจพเจเจเฉ เจฒเฉเจฃ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจ เจธเฉเจ เจเจธ เจตเฉเจเจฐ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฌเจฃเจพเจตเจพเจเจเฉ เจ เจคเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจเจธ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจชเฉเฉฑเจเจฃเจเฉ, เจธเจตเจพเจฒ เจฆเจฟเจฒเจเจธเจช เจนเจจเฅค
เจธเจญ เจคเฉเจ เจธเฉเจเจพ เจคเจฐเฉเจเจพ เจนเฉ เจเจฆเฉเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจฒเจเจพเจคเจพเจฐ เจตเฉเจเจฐ เจจเฉเฉฐ เจเจพเจเจเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจฒเจ เจชเฉเฉฑเจเจฃเจเฉ. เจเจน. เจนเฉเจฃ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจจเฉเฉเฉ เจฆเฉ เจเจพเจเจเฉ เจฆเฉ เจเจกเฉเจ เจจเจนเฉเจ เจเจฐเจจเจเฉ, เจชเจฐ เจเจกเฉเจ เจเจฐเฉ เจเจพเจ เจตเฉเจเจฐ เจจเฉเฉฐ เจชเฉเฉฑเจเฉ. เจธเจญ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจ เจธเฉเจ เจเจธเจฆเฉ เจฒเจ เจธเจฟเจฐเจซเจผ เจฏเฉเจเจผเจฐ เจธเจชเฉเจธ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ, เจเจธ เจตเจฟเฉฑเจ เจ เจธเฉเจ เจเจฐเจจเจฒ เจคเฉเจ เจเจฟเจธเฉ เจตเฉ เจชเฉเจฐเจเจฟเจฐเจฟเจ เจจเฉเฉฐ เจเจพเจฒ เจเจฐเจจ เจฒเจ เจฐเฉเจเจพเจตเจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจจเจนเฉเจ เจเจฐเจฆเฉ (เจนเฉเจ เจพเจ เจเจนเจจเจพเจ เจฌเจพเจฐเฉ)เฅค
เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจตเจฟเฉฑเจ เจนเฉฑเจฒ
เจเฉฑเจฅเฉ เจ เจธเฉเจ เจเจนเฉ เจเจฐเจพเจเจเฉ เจเจฟเจตเฉเจ เจ เจธเฉเจ เจเฉฑเจ เจเจพเจเจเฉ เจ เจคเฉ เจฆเฉ เจซเจฟเจฒเจพเจธเจซเจฐเจพเจ เจจเจพเจฒ เจเจฐเจฆเฉ เจธเฉ, เจ เจธเฉเจ เจเฉฑเจ เจเฉฑเจเจฐ เจตเจฟเฉฑเจ เจเฉเฉฐเจฎเจพเจเจเฉ เจ เจคเฉ เจเจกเฉเจ เจเจฐเจพเจเจเฉเฅค เจชเจฐ เจนเฉเจฃ เจเจน เจธเจพเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจนเฉเจฃเจเฉ เจ เจคเฉ, เจเจฟเจตเฉเจ เจเจฟ เจเจน เจธเจจ, เจเฉเจตเจฒ เจเฉฑเจ เจซเฉเจฐเจ, เจฏเจพเจจเฉ. เจเจน เจเจฟเจนเจพ เจเจพ เจธเจเจฆเจพ เจนเฉ เจเจฟ เจตเฉเจเจฐ เจคเฉเจ เจเจน "เจธเฉเจจเจนเจฟเจฐเฉ เจเจพเจเจเจพ" เจฒเฉเจฃ เจตเจพเจฒเจพ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจนเฉ เจเจพเจตเฉเจเจพเฅค เจเจธเจฆเฉ เจฒเจ เจ เจธเฉเจ SpinLock เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจเฅค
private static SpinLock spinLock = new SpinLock(); // ะะฐั "ะพัะธัะธะฐะฝั"
private void RunSpinLock(int i, CancellationToken token)
{
while (true)
{
// ะะทะฐะธะผะฝะฐั ะฑะปะพะบะธัะพะฒะบะฐ ัะตัะตะท busy waiting. ะัะทัะฒะฐะตะผ ะดะพ try, ััะพะฑั
// ะฒัะฑัะฐัะธัั ะธัะบะปััะตะฝะธะต ะฒ ัะปััะฐะต ะพัะธะฑะบะธ ะฒ ัะฐะผะพะผ SpinLock.
bool hasLock = false;
spinLock.Enter(ref hasLock);
try
{
// ะะดะตัั ะผะพะถะตั ะฑััั ัะพะปัะบะพ ะพะดะธะฝ ะฟะพัะพะบ (mutual exclusion).
forks[Left(i)] = i + 1; // ะะตัะตะผ ะฒะธะปะบั ััะฐะทั, ะฑะตะท ะพะถะธะดะฐะฝะธั.
forks[Right(i)] = i + 1;
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
forks[Left(i)] = 0;
forks[Right(i)] = 0;
}
finally
{
if(hasLock) spinLock.Exit(); // ะะทะฑะตะณะฐะตะผ ะฟัะพะฑะปะตะผั ัะพ ัะผะตัััั ัะธะปะพัะพัะฐ.
}
Think(i);
if (token.IsCancellationRequested)
break;
}
}
SpinLock
เจเจน เจเฉฑเจ เจฌเจฒเฉเจเจฐ เจนเฉ, เจเจธเจฆเฉ เจจเจพเจฒ, เจฎเฉเจเฉ เจคเฉเจฐ 'เจคเฉ, เจเจนเฉ while(true) { if (!lock) break; }
, เจชเจฐ เจ
เฉฐเจฆเจฐ เจจเจพเจฒเฉเจ เจตเฉ เจตเฉฑเจง "เจเจพเจฆเฉ" เจจเจพเจฒ SpinWait
(เจเฉ เจเฉฑเจฅเฉ เจตเจฐเจคเจฟเจ เจเจพเจเจฆเจพ เจนเฉ)เฅค เจนเฉเจฃ เจเจน เจเจพเจฃเจฆเจพ เจนเฉ เจเจฟ เจเจกเฉเจ เจเจฐเจจ เจตเจพเจฒเจฟเจเจ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจเจฟเจฃเจจเจพ เจนเฉ, เจเจจเฉเจนเจพเจ เจจเฉเฉฐ เจฅเฉเฉเจพ เจเจฟเจนเจพ เจธเฉเจฃเจพ เจนเฉ, เจ
เจคเฉ เจนเฉเจฐ เจตเฉ เจฌเจนเฉเจค เจเฉเจเฅค เจเจฆเจฟเฅค เจเจฎ เจคเฉเจฐ 'เจคเฉ, เจ
เจจเฉเจเฉเจฒ เจฌเจฃเจพเจเจฃ เจฒเจ เจนเจฐ เจธเฉฐเจญเจต เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเจพ เจนเฉเฅค เจชเจฐ เจธเจพเจจเฉเฉฐ เจเจน เจฏเจพเจฆ เจฐเฉฑเจเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจเจฟ เจเจน เจ
เจเฉ เจตเฉ เจเจนเฉ เจเจฟเจฐเจฟเจเจธเจผเฉเจฒ เจเฉฑเจเจฐ เจนเฉ เจเฉ เจชเฉเจฐเฉเจธเฉเจธเจฐ เจธเจฐเฉเจคเจพเจ เจจเฉเฉฐ เจเจพเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจชเฉเจฐเจตเจพเจน เจจเฉเฉฐ เจเจพเจฐเฉ เจฐเฉฑเจเจฆเจพ เจนเฉ, เจเจฟเจธ เจจเจพเจฒ เจญเฉเฉฑเจเจฎเจฐเฉ เจนเฉ เจธเจเจฆเฉ เจนเฉ เจเฉเจเจฐ เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจฆเฉเจเจฟเจเจ เจจเจพเจฒเฉเจ เจตเจงเฉเจฐเฉ เจคเจฐเจเฉเจน เจฌเจฃ เจเจพเจเจฆเจพ เจนเฉ, เจชเจฐ เจเฉฑเจ เจธเฉเจจเจนเจฟเจฐเฉ เจซเฉเจฐเจ เจจเจนเฉเจ เจนเฉเฉฐเจฆเจพ (เจชเฉเจฐเจพเจเจฐเจฟเจเฉ เจเจจเจตเจฐเจเจผเจจ เจธเจฎเฉฑเจธเจฟเจ) . เจเจธ เจฒเจ, เจ
เจธเฉเจ เจเจธเจฆเฉ เจตเจฐเจคเฉเจ เจธเจพเจเจเฉ เจเฉเจคเฉ เจฎเฉเจฎเฉเจฐเฉ เจตเจฟเฉฑเจ เจฌเจนเฉเจค เจนเฉ เจเฉเจเฉเจเจ เจคเจฌเจฆเฉเจฒเฉเจเจ เจฒเจ เจเจฐเจฆเฉ เจนเจพเจ, เจฌเจฟเจจเจพเจ เจเจฟเจธเฉ เจคเฉเจเฉ-เจงเจฟเจฐ เจเจพเจฒเจพเจ, เจจเฉเจธเจเจก เจฒเจพเจ เจ
เจคเฉ เจนเฉเจฐ เจนเฉเจฐเจพเจจเฉ เจฆเฉเฅค
เจฒเจ เจกเจฐเจพเจเฉฐเจ SpinLock
. เจงเจพเจฐเจพเจตเจพเจ เจธเฉเจจเจนเจฟเจฐเฉ เจเจพเจเจเฉ เจฒเจ เจฒเจเจพเจคเจพเจฐ "เจฒเฉเจฆเฉเจเจ" เจนเจจเฅค เจ
เจธเจซเจฒเจคเจพเจตเจพเจ เจนเจจ - เจเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจ, เจเฉเจฃเจฟเจ เจเฉเจคเจฐ. เจเฉเจฐ เจชเฉเจฐเฉ เจคเจฐเฉเจนเจพเจ เจจเจนเฉเจ เจตเจฐเจคเฉ เจเจ เจนเจจ: เจเจนเจจเจพเจ เจเจพเจฐ เจฅเจฐเจฟเฉฑเจกเจพเจ เจฆเฉเจเจฐเจพ เจธเจฟเจฐเจซ 2/3.
เจเฉฑเจฅเฉ เจเฉฑเจ เจนเฉเจฐ เจนเฉฑเจฒ เจธเจฟเจฐเจซ เจตเจฐเจคเจฃ เจฒเจ เจนเฉเจตเฉเจเจพ Interlocked.CompareExchange
เจเจชเจฐเฉเจเจค เจเฉเจก (เจญเฉเฉฑเจเฉ เจฎเจฐเจจ เจตเจพเจฒเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจตเจฟเฉฑเจ) เจตเจฟเฉฑเจ เจฆเจฐเจธเจพเจ เจเจ เจเจธเฉ เจเจฟเจฐเจฟเจเจธเจผเฉเจฒ เจเจกเฉเจ เจฆเฉ เจจเจพเจฒ, เจชเจฐ เจเจน, เจเจฟเจตเฉเจ เจเจฟ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจเจฟเจนเจพ เจเจฟเจ เจนเฉ, เจธเจฟเจงเจพเจเจคเจ เจคเฉเจฐ 'เจคเฉ เจฌเจฒเจพเจเจฟเฉฐเจ เจตเฉฑเจฒ เจฒเฉ เจเจพ เจธเจเจฆเจพ เจนเฉเฅค
'เจคเฉ Interlocked
เจเจน เจจเฉเจ เจเฉเจคเจพ เจเจพเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ เจเจฟ เจเฉฑเจฅเฉ เจนเฉ เจจเจนเฉเจ เจนเฉ CompareExchange
, เจชเจฐ เจชเจฐเจฎเจพเจฃเฉ เจชเฉเฉเจนเจจ เจ
เจคเฉ เจฒเจฟเจเจฃ เจฆเฉ เจนเฉเจฐ เจคเจฐเฉเจเฉ เจตเฉ เจนเจจเฅค เจ
เจคเฉ เจชเจฐเจฟเจตเจฐเจคเจจ เจฆเฉเจนเจฐเจพเจ เจฆเฉเจเจฐเจพ, เจเฉเจเจฐ เจเจฟเจธเฉ เจนเฉเจฐ เจฅเฉเจฐเฉเจก เจตเจฟเฉฑเจ เจคเจฌเจฆเฉเจฒเฉเจเจ เจเจฐเจจ เจฆเจพ เจธเจฎเจพเจ เจนเฉ (เจชเฉเฉเจนเฉ 1, เจชเฉเฉเจนเฉ 2, เจฒเจฟเจเฉ 2, เจฒเจฟเจเฉ 1 เจเจฐเจพเจฌ เจนเฉ), เจเจธเจฆเฉ เจตเจฐเจคเฉเจ เจเฉฑเจ เจธเจฟเฉฐเจเจฒ เจฎเฉเฉฑเจฒ (เจเฉฐเจเจฐเจฒเจพเจเจก เจเจจเฉเจฅเจฟเฉฐเจ เจชเฉเจเจฐเจจ) เจตเจฟเฉฑเจ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจคเจฌเจฆเฉเจฒเฉเจเจ เจฒเจ เจเฉเจคเฉ เจเจพ เจธเจเจฆเฉ เจนเฉเฅค
เจเจฐเจจเจฒ เจฎเฉเจก เจนเฉฑเจฒ
เจเฉฑเจ เจฒเฉเจช เจตเจฟเฉฑเจ เจธเจฐเฉเจคเจพเจ เจจเฉเฉฐ เจฌเจฐเจฌเจพเจฆ เจเจฐเจจ เจคเฉเจ เจฌเจเจฃ เจฒเจ, เจเจ เจฆเฉเจเฉเจ เจเจฟ เจ
เจธเฉเจ เจเฉฑเจ เจงเจพเจเฉ เจจเฉเฉฐ เจเจฟเจตเฉเจ เจฌเจฒเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจเฅค เจฆเฉเจเฉ เจธเจผเจฌเจฆเจพเจ เจตเจฟเจ, เจธเจพเจกเฉ เจเจฆเจพเจนเจฐเจฃ เจจเฉเฉฐ เจเจพเจฐเฉ เจฐเฉฑเจเจฆเฉ เจนเฉเจ, เจเจ เจฆเฉเจเฉเจ เจเจฟ เจเจฟเจตเฉเจ เจตเฉเจเจฐ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจจเฉเฉฐ เจธเฉเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจฒเฉเฉ เจชเฉเจฃ 'เจคเฉ เจนเฉ เจเจธ เจจเฉเฉฐ เจเจเจพเจเจเจฆเจพ เจนเฉเฅค เจชเจนเจฟเจฒเจพเจ, เจเจ เจฆเฉเจเฉเจ เจเจฟ เจเจน เจเจชเจฐเฉเจเจฟเฉฐเจ เจธเจฟเจธเจเจฎ เจฆเฉ เจเจฐเจจเจฒ เจฎเฉเจก เจฐเจพเจนเฉเจ เจเจฟเจตเฉเจ เจเจฐเจจเจพ เจนเฉเฅค เจเฉฑเจฅเฉ เจธเจพเจฐเฉเจเจ เจฌเจฃเจคเจฐเจพเจ เจ
เจเจธเจฐ เจเจชเจญเฉเจเจคเจพ เจธเจชเฉเจธ เจจเจพเจฒเฉเจ เจนเฉเจฒเฉ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจเฅค เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเจ เจตเจพเจฐ เจนเฉเจฒเฉ AutoResetEvent
เจธเจผเจพเจเจฆ 53 เจเฉเจฃเจพ เจนเฉเจฒเฉ SpinLock
[เจฐเจฟเจเจเจฐ]เฅค เจชเจฐ เจเจนเจจเจพเจ เจฆเฉ เจฎเจฆเจฆ เจจเจพเจฒ, เจคเฉเจธเฉเจ เจชเฉเจฐเฉ เจธเจฟเจธเจเจฎ เจตเจฟเฉฑเจ เจชเฉเจฐเจเจฟเจฐเจฟเจเจตเจพเจ เจจเฉเฉฐ เจธเจฎเจเจพเจฒเฉ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจเจพเจ เจจเจนเฉเจเฅค
เจเฉฑเจฅเฉ เจฌเฉเจจเจฟเจเจฆเฉ เจเจธเจพเจฐเฉ เจ
เฉฑเจงเฉ เจธเจฆเฉ เจชเจนเจฟเจฒเจพเจ เจกเจฟเจเจเจธเจเฉเจฐเจพ เจฆเฉเจเจฐเจพ เจชเฉเจฐเจธเจคเจพเจตเจฟเจค เจธเฉเจฎเจซเฉเจฐเจฐ เจนเฉเฅค เจเฉฑเจ เจธเฉเจฎเจพเจซเฉเจฐ, เจธเจงเจพเจฐเจจ เจฐเฉเจช เจตเจฟเฉฑเจ, เจธเจฟเจธเจเจฎ เจฆเฉเจเจฐเจพ เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจเฉฑเจ เจธเจเจพเจฐเจพเจคเจฎเจ เจชเฉเจฐเจจ เจ
เฉฐเจ เจนเฉ, เจ
เจคเฉ เจเจธ 'เจคเฉ เจฆเฉ เจเจชเจฐเฉเจธเจผเจจ, เจตเจพเจงเจพ เจ
เจคเฉ เจเจเจฃเจพเฅค เจเฉ เจเจน เจเจเจฃ เจตเจฟเฉฑเจ เจ
เจธเจซเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจเจผเฉเจฐเฉ, เจคเจพเจ เจเจพเจฒเจฟเฉฐเจ เจฅเจฐเจฟเฉฑเจก เจฌเจฒเฉเจ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉเฅค เจเจฆเฉเจ เจเจฟเจธเฉ เจนเฉเจฐ เจเจฟเจฐเจฟเจเจธเจผเฉเจฒ เจฅเฉเจฐเฉเจก/เจชเฉเจฐเจเจฟเจฐเจฟเจ เจฆเฉเจเจฐเจพ เจธเฉฐเจเจฟเจ เจจเฉเฉฐ เจตเจงเจพเจเจ เจเจพเจเจฆเจพ เจนเฉ, เจคเจพเจ เจฅเฉเจฐเฉเฉฑเจกเจพเจ เจจเฉเฉฐ เจเฉฑเจก เจฆเจฟเฉฑเจคเจพ เจเจพเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจชเจพเจธ เจเฉเจคเฉ เจจเฉฐเจฌเจฐ เจฆเฉเจเจฐเจพ เจธเฉเจฎเจซเฉเจฐ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจเจเจพเจเจ เจเจพเจเจฆเจพ เจนเฉเฅค เจเฉเจ เจตเฉ เจธเฉเจฎเจซเฉเจฐ เจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจฐเฉเจเจพเจตเจ เจตเจฟเฉฑเจ เจฐเฉเจฒ เจเฉฑเจกเฉเจเจ เจฆเฉ เจเจฒเจชเจจเจพ เจเจฐ เจธเจเจฆเจพ เจนเฉ. .NET เจธเจฎเจพเจจ เจเจพเจฐเจเจธเจผเฉเจฒเจคเจพ เจฆเฉ เจจเจพเจฒ เจเจ เจจเจฟเจฐเจฎเจพเจฃ เจฆเฉ เจชเฉเจธเจผเจเจธเจผ เจเจฐเจฆเจพ เจนเฉ: AutoResetEvent
, ManualResetEvent
, Mutex
เจ
เจคเฉ เจฎเฉเจ Semaphore
. เจ
เจธเฉเจ เจตเจฐเจคเจพเจเจเฉ AutoResetEvent
, เจเจน เจเจนเจจเจพเจ เจจเจฟเจฐเจฎเจพเจฃเจพเจ เจตเจฟเฉฑเจเฉเจ เจธเจญ เจคเฉเจ เจธเจฐเจฒ เจนเฉ: เจธเจฟเจฐเจซ เจฆเฉ เจฎเฉเฉฑเจฒ 0 เจ
เจคเฉ 1 (เจเจฒเจค, เจธเฉฑเจ)เฅค เจเจธเจฆเจพ เจคเจฐเฉเจเจพ WaitOne()
เจเจพเจฒเจฟเฉฐเจ เจฅเฉเจฐเฉเจก เจจเฉเฉฐ เจฌเจฒเฉเจ เจเจฐเจฆเจพ เจนเฉ เจเฉเจเจฐ เจฎเฉเฉฑเจฒ 0 เจธเฉ, เจ
เจคเฉ เจเฉเจเจฐ 1, เจเจธเจจเฉเฉฐ 0 เจคเฉฑเจ เจเจเจพ เจฆเจฟเฉฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจธเจจเฉเฉฐ เจเฉฑเจก เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจเฉฑเจ เจขเฉฐเจ Set()
1 เจคเฉฑเจ เจตเจงเจพเจเจเจฆเจพ เจนเฉ เจ
เจคเฉ เจเฉฑเจ เจตเฉเจเจฐ เจจเฉเฉฐ เจฒเฉฐเจเจฃ เจฆเจฟเฉฐเจฆเจพ เจนเฉ, เจเฉ เจฆเฉเจฌเจพเจฐเจพ 0 เจคเฉฑเจ เจเจเจพเจเจเจฆเจพ เจนเฉเฅค เจธเจฌเจตเฉเจ
เจเจฐเจจเจธเจเจพเจเจฒ เจตเจพเจเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉเฅค
เจเจ เจนเฉฑเจฒ เจจเฉเฉฐ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจเจฐเฉเจ เจ เจคเฉ เจนเจฐเฉเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจฒเจ เจฒเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเฉเจ, เจจเจพ เจเจฟ เจธเจพเจฐเจฟเจเจ เจฒเจ เจเฉฑเจเฉ เจตเจพเจฐเฅค เจเจน. เจนเฉเจฃ เจเฉฑเจ เจตเจพเจฐ เจตเจฟเฉฑเจ เจเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจนเฉ เจธเจเจฆเฉ เจนเจจ, เจเฉฑเจ เจจเจนเฉเจเฅค เจชเจฐ เจ เจธเฉเจ เจฆเฉเจฌเจพเจฐเจพ เจธเจพเจฐเจฃเฉ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจจเฉเฉฐ เจธเจนเฉ เจขเฉฐเจ เจจเจพเจฒ เจฌเจฒเฉเจ เจเจฐเจฆเฉ เจนเจพเจ, เจจเจธเจฒเจพเจ (เจฆเฉเฉ เจฆเฉเจเจ เจธเจฅเจฟเจคเฉเจเจ) เจคเฉเจ เจฌเจเจฃ เจฒเจ, เจฏเจเฉเจจเฉ เจคเฉเจฐ 'เจคเฉ เจฌเฉเจเจธ เจฒเจเฅค
// ะะปั ะฑะปะพะบะธัะพะฒะฐะฝะธั ะพัะดะตะปัะฝะพะณะพ ัะธะปะพัะพัะฐ.
// ะะฝะธัะธะฐะปะธะทะธััะตััั: new AutoResetEvent(true) ะดะปั ะบะฐะถะดะพะณะพ.
private AutoResetEvent[] philosopherEvents;
// ะะปั ะดะพัััะฟะฐ ะบ ะฒะธะปะบะฐะผ / ะดะพัััะฟ ะบ ััะพะปั.
private AutoResetEvent tableEvent = new AutoResetEvent(true);
// ะ ะพะถะดะตะฝะธะต ัะธะปะพัะพัะฐ.
public void Run(int i, CancellationToken token)
{
while (true)
{
TakeForks(i); // ะะดะตั ะฒะธะปะบะธ.
// ะะฑะตะด. ะะพะถะตั ะฑััั ะธ ะดะพะปััะต.
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
PutForks(i); // ะัะดะฐัั ะฒะธะปะบะธ ะธ ัะฐะทะฑะปะพะบะธัะพะฒะฐัั ัะพัะตะดะตะน.
Think(i);
if (token.IsCancellationRequested) break;
}
}
// ะะถะธะดะฐัั ะฒะธะปะบะธ ะฒ ะฑะปะพะบะธัะพะฒะบะต.
void TakeForks(int i)
{
bool hasForks = false;
while (!hasForks) // ะะพะฟัะพะฑะพะฒะฐัั ะตัะต ัะฐะท (ะฑะปะพะบะธัะพะฒะบะฐ ะฝะต ะทะดะตัั).
{
// ะัะบะปััะฐััะธะน ะดะพัััะฟ ะบ ััะพะปั, ะฑะตะท ะณะพะฝะพะบ ะทะฐ ะฒะธะปะบะฐะผะธ.
tableEvent.WaitOne();
if (forks[Left(i)] == 0 && forks[Right(i)] == 0)
forks[Left(i)] = forks[Right(i)] = i + 1;
hasForks = forks[Left(i)] == i + 1 && forks[Right(i)] == i + 1;
if (hasForks)
// ะขะตะฟะตัั ัะธะปะพัะพั ะฟะพะตัั, ะฒัะนะดะตั ะธะท ัะธะบะปะฐ. ะัะปะธ Set
// ะฒัะทะฒะฐะฝ ะดะฒะฐะถะดั, ัะพ ะทะฝะฐัะตะฝะธะต true.
philosopherEvents[i].Set();
// ะ ะฐะทะฑะปะพะบะธัะพะฒะฐัั ะพะดะฝะพะณะพ ะพะถะธะดะฐััะตะณะพ. ะะพัะปะต ะฝะตะณะพ ะทะฝะฐัะตะฝะธะต tableEvent ะฒ false.
tableEvent.Set();
// ะัะปะธ ะธะผะตะตั true, ะฝะต ะฑะปะพะบะธััะตััั, ะฐ ะตัะปะธ false, ัะพ ะฑัะดะตั ะถะดะฐัั Set ะพั ัะพัะตะดะฐ.
philosopherEvents[i].WaitOne();
}
}
// ะัะดะฐัั ะฒะธะปะบะธ ะธ ัะฐะทะฑะปะพะบะธัะพะฒะฐัั ัะพัะตะดะตะน.
void PutForks(int i)
{
tableEvent.WaitOne(); // ะะตะท ะณะพะฝะพะบ ะทะฐ ะฒะธะปะบะฐะผะธ.
forks[Left(i)] = 0;
// ะัะพะฑัะดะธัั ะปะตะฒะพะณะพ, ะฐ ะฟะพัะพะผ ะธ ะฟัะฐะฒะพะณะพ ัะพัะตะดะฐ, ะปะธะฑะพ AutoResetEvent ะฒ true.
philosopherEvents[LeftPhilosopher(i)].Set();
forks[Right(i)] = 0;
philosopherEvents[RightPhilosopher(i)].Set();
tableEvent.Set();
}
เจเจน เจธเจฎเจเจฃ เจฒเจ เจเจฟ เจเฉฑเจฅเฉ เจเฉ เจนเฉ เจฐเจฟเจนเจพ เจนเฉ, เจเจธ เจฎเจพเจฎเจฒเฉ 'เจคเฉ เจตเจฟเจเจพเจฐ เจเจฐเฉ เจเจฆเฉเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจเจพเจเจเฉ เจฒเฉเจฃ เจตเจฟเฉฑเจ เจ
เจธเจซเจฒ เจฐเจฟเจนเจพ, เจคเจพเจ เจเจธเจฆเฉ เจเจฟเจฐเจฟเจเจตเจพเจ เจนเฉเจ เจฒเจฟเจเฉ เจ
เจจเฉเจธเจพเจฐ เจนเฉเจฃเจเฉ. เจเจน เจฎเฉเจเจผ เจคเฉฑเจ เจชเจนเฉเฉฐเจเจฃ เจฆเฉ เจเจกเฉเจ เจเจฐ เจฐเจฟเจนเจพ เจนเฉเฅค เจเจธ เจจเฉเฉฐ เจชเฉเจฐเจพเจชเจค เจเจฐเจเฉ, เจเจน เจเจพเจเจเฉ เจฒเฉเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเจพ เจนเฉเฅค เจเฉฐเจฎ เจจเจนเฉเจ เจเฉเจคเจพเฅค เจเจน เจธเจพเจฐเจฃเฉ (เจเจชเจธเฉ เจฌเฉเจฆเจเจฒเฉ) เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค เจ
เจคเฉ เจเจชเจฃเจพ "เจเจฐเจจเจธเจเจพเจเจฒ" เจชเจพเจธ เจเจฐเจฆเจพ เจนเฉ (AutoResetEvent
) (เจเจน เจธเจผเฉเจฐเฉ เจตเจฟเฉฑเจ เจเฉเฉฑเจฒเฉเจนเฉ เจนเจจ)เฅค เจเจน เจฆเฉเจฌเจพเจฐเจพ เจเฉฑเจเจฐ เจตเจฟเฉฑเจ เจ เจเจพเจเจฆเจพ เจนเฉ, เจเจฟเจเจเจเจฟ เจเจธ เจเฉเจฒ เจเฉเจ เจเจพเจเจเฉ เจจเจนเฉเจ เจนเจจเฅค เจเจน เจเจจเฉเจนเจพเจ เจจเฉเฉฐ เจฒเฉเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจเจชเจฃเฉ "เจเจฐเจจเจธเจเจพเจเจฒ" 'เจคเฉ เจฐเฉเจ เจเจพเจเจฆเจพ เจนเฉเฅค เจธเฉฑเจเฉ เจเจพเจ เจเฉฑเจฌเฉ เจชเจพเจธเฉ เจเฉเจ เจนเฉเจฐ เจเจฟเจธเจฎเจค เจตเจพเจฒเฉ เจเฉเจเจเจขเฉ, เจเจพเจฃเจพ เจเจคเจฎ เจเจฐเจจ เจคเฉเจ เจฌเจพเจ
เจฆ, เจธเจพเจกเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจจเฉเฉฐ "เจเจชเจฃเฉ เจตเจพเจฐเฉ เจเฉเจฒเฉเจนเจฆเฉ เจนเฉเจ" เจฆเจพ เจคเจพเจฒเจพ เจเฉเจฒเฉเจน เจฆเจฟเฉฐเจฆเฉ เจนเจจเฅค เจธเจพเจกเจพ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจฆเฉเจเฉ เจตเจพเจฐ เจเจธเจจเฉเฉฐ เจชเจพเจธ เจเจฐเจฆเจพ เจนเฉ (เจ
เจคเฉ เจเจน เจเจธเจฆเฉ เจชเจฟเฉฑเจเฉ เจฌเฉฐเจฆ เจนเฉ เจเจพเจเจฆเจพ เจนเฉ)เฅค เจเจน เจคเฉเจเฉ เจตเจพเจฐ เจเจพเจเจเฉ เจฒเฉเจฃ เจฆเฉ เจเฉเจธเจผเจฟเจธเจผ เจเจฐเจฆเจพ เจนเฉเฅค เจเฉเจธเจผเจเจฟเจธเจฎเจคเฉ. เจ
เจคเฉ เจเจน เจญเฉเจเจจ เจเจฐเจจ เจฒเจ เจเจชเจฃเฉ เจตเจพเจฐเฉ เจชเจพเจธ เจเจฐเจฆเจพ เจนเฉเฅค
เจเจฆเฉเจ เจ
เจเจฟเจนเฉ เจเฉเจก เจตเจฟเฉฑเจ เจฌเฉเจคเจฐเจคเฉเจฌ เจเจฒเจคเฉเจเจ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจ (เจเจน เจนเจฎเฉเจธเจผเจพ เจฎเฉเจเฉเจฆ เจนเฉเฉฐเจฆเฉเจเจ เจนเจจ), เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจเฉฑเจ เจเฉเจเจเจขเฉ เจเจฒเจค เจขเฉฐเจ เจจเจพเจฒ เจจเจฟเจฐเจงเจพเจฐเจค เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจเจพเจ เจเจนเฉ เจตเจธเจคเฉ เจฌเจฃเจพเจ เจเจ เจนเฉ AutoResetEvent
เจธเจญ เจฒเจ (Enumerable.Repeat
), เจซเจฟเจฐ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจกเจฟเจตเฉเจฒเจชเจฐเจพเจ เจฆเฉ เจเจกเฉเจ เจเจฐ เจฐเจนเฉ เจนเฉเจฃเจเฉ, เจเจฟเจเจเจเจฟ เจ
เจเจฟเจนเฉ เจเฉเจก เจตเจฟเฉฑเจ เจคเจฐเฉเฉฑเจเฉเจเจ เจจเฉเฉฐ เจฒเฉฑเจญเจฃเจพ เจเจพเจซเจผเฉ เจฎเฉเจธเจผเจเจฒ เจเฉฐเจฎ เจนเฉเฅค เจเจธ เจนเฉฑเจฒ เจจเจพเจฒ เจเจ เจนเฉเจฐ เจธเจฎเฉฑเจธเจฟเจ เจเจน เจนเฉ เจเจฟ เจเจน เจเจธ เจเฉฑเจฒ เจฆเฉ เจเจพเจฐเฉฐเจเฉ เจจเจนเฉเจ เจฆเจฟเฉฐเจฆเจพ เจเจฟ เจเฉเจ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจญเฉเฉฑเจเจพ เจจเจนเฉเจ เจฎเจฐเฉเจเจพเฅค
เจนเจพเจเจฌเฉเจฐเจฟเจก เจนเฉฑเจฒ
เจ
เจธเฉเจ เจธเจฎเฉเจ เจฒเจ เจฆเฉ เจชเจนเฉเฉฐเจเจพเจ เจจเฉเฉฐ เจฆเฉเจเจฟเจ เจนเฉ, เจเจฆเฉเจ เจ
เจธเฉเจ เจเจชเจญเฉเจเจคเจพ เจฎเฉเจก เจ
เจคเฉ เจฒเฉเจช เจตเจฟเฉฑเจ เจฐเจนเจฟเฉฐเจฆเฉ เจนเจพเจ, เจ
เจคเฉ เจเจฆเฉเจ เจ
เจธเฉเจ เจเจฐเจจเจฒ เจฆเฉเจเจฐเจพ เจฅเฉเจฐเฉเจก เจจเฉเฉฐ เจฌเจฒเฉเจ เจเจฐเจฆเฉ เจนเจพเจเฅค เจชเจนเจฟเจฒเจพ เจคเจฐเฉเจเจพ เจเฉเจเฉ เจคเจพเจฒเฉ เจฒเจ เจเฉฐเจเจพ เจนเฉ, เจฆเฉเจเจพ เจฒเฉฐเจฌเฉ เจฒเฉเจเจพเจ เจฒเจเฅค เจฒเฉเจช เจตเจฟเฉฑเจ เจฌเจฆเจฒเจฃ เจฒเจ เจเฉฑเจ เจตเฉเจฐเฉเจเจฌเจฒ เจฒเจ เจชเจนเจฟเจฒเจพเจ เจฅเฉเฉเฉเจนเฉ เจธเจฎเฉเจ เจฒเจ เจเฉฐเจคเจเจผเจพเจฐ เจเจฐเจจเจพ เจ
เจเจธเจฐ เจเจผเจฐเฉเจฐเฉ เจนเฉเฉฐเจฆเจพ เจนเฉ, เจ
เจคเฉ เจซเจฟเจฐ เจเจฆเฉเจ เจเจกเฉเจ เจฒเฉฐเจฎเฉ เจนเฉเฉฐเจฆเฉ เจนเฉ เจคเจพเจ เจฅเจฐเจฟเฉฑเจก เจจเฉเฉฐ เจฌเจฒเฉเจ เจเจฐเฉเฅค เจเจธ เจชเจนเฉเฉฐเจ เจจเฉเฉฐ เจเจธ เจฒเจ-เจเจนเจฟเฉฐเจฆเฉ เจตเจฟเฉฑเจ เจฒเจพเจเฉ เจเฉเจคเจพ เจเจฟเจ เจนเฉ. เจนเจพเจเจฌเฉเจฐเจฟเจก เจฌเจฃเจคเจฐ. เจเฉฑเจฅเฉ เจเจฐเจจเจฒ เจฎเฉเจก เจฒเจ เจเจนเฉ เจฌเจฃเจคเจฐ เจนเจจ, เจชเจฐ เจนเฉเจฃ เจเจชเจญเฉเจเจคเจพ เจฎเฉเจก เจฒเฉเจช เจจเจพเจฒ: SemaphorSlim
, ManualResetEventSlim
เจเจฆเจฟเฅค เจเฉฑเจฅเฉ เจธเจญ เจคเฉเจ เจชเฉเจฐเจธเจฟเฉฑเจง เจกเจฟเจเจผเจพเจเจจ เจนเฉ Monitor
, เจเจฟเจเจเจเจฟ C# เจตเจฟเฉฑเจ เจเฉฑเจ เจฎเจธเจผเจนเฉเจฐ เจนเฉ lock
เจธเฉฐเจเฉเจเจธ Monitor
เจเจน เจเจนเฉ เจธเฉเจฎเจพเจซเฉเจฐ เจนเฉ เจเจฟเจธเจฆเจพ เจ
เจงเจฟเจเจคเจฎ เจฎเฉเฉฑเจฒ 1 (เจฎเจฟเจเจเฉเจเจธ) เจนเฉ, เจชเจฐ เจฒเฉเจช, เจฐเฉเจเจฐเจธเจผเจจ, เจเฉฐเจกเฉเจธเจผเจจ เจตเฉเจฐเฉเจเจฌเจฒ เจชเฉเจเจฐเจจ (เจนเฉเจ เจพเจ เจเจธ เจฌเจพเจฐเฉ เจนเฉเจฐ), เจเจฆเจฟ เจตเจฟเฉฑเจ เจเจกเฉเจ เจเจฐเจจ เจฒเจ เจธเจฎเจฐเจฅเจจ เจฆเฉ เจจเจพเจฒเฅค เจเจ เจเจธเจฆเฉ เจจเจพเจฒ เจเฉฑเจ เจนเฉฑเจฒ เจตเฉเจเฉเจเฅค
// ะกะฟัััะตะผ ะพะฑัะตะบั ะดะปั ะะพะฝะธัะพัะฐ ะพั ะฒัะตั
, ััะพะฑั ะฑะตะท ะดะตะดะปะพะบะพะฒ.
private readonly object _lock = new object();
// ะัะตะผั ะพะถะธะดะฐะฝะธั ะฟะพัะพะบะฐ.
private DateTime?[] _waitTimes = new DateTime?[philosophersAmount];
public void Run(int i, CancellationToken token)
{
while (true)
{
TakeForks(i);
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
PutForks(i);
Think(i);
if (token.IsCancellationRequested) break;
}
}
// ะะฐัะต ัะปะพะถะฝะพะต ััะปะพะฒะธะต ะดะปั Condition Variable ะฟะฐััะตัะฝะฐ.
bool CanIEat(int i)
{
// ะัะปะธ ะตััั ะฒะธะปะบะธ:
if (forks[Left(i)] != 0 && forks[Right(i)] != 0)
return false;
var now = DateTime.Now;
// ะะพะถะตั, ะตัะปะธ ัะพัะตะดะธ ะฝะต ะฑะพะปะตะต ะณะพะปะพะดะฝัะต, ัะตะผ ัะตะบััะธะน.
foreach(var p in new int[] {LeftPhilosopher(i), RightPhilosopher(i)})
if (_waitTimes[p] != null && now - _waitTimes[p] > now - _waitTimes[i])
return false;
return true;
}
void TakeForks(int i)
{
// ะะฐะนัะธ ะฒ ะะพะฝะธัะพั. ะขะพ ะถะต ัะฐะผะพะต: lock(_lock) {..}.
// ะัะทัะฒะฐะตะผ ะฒะฝะต try, ััะพะฑั ะฒะพะทะผะพะถะฝะพะต ะธัะบะปััะตะฝะธะต ะฒัะฑัะฐััะฒะฐะปะพัั ะฒััะต.
bool lockTaken = false;
Monitor.Enter(_lock, ref lockTaken);
try
{
_waitTimes[i] = DateTime.Now;
// Condition Variable ะฟะฐััะตัะฝ. ะัะฒะพะฑะพะถะดะฐะตะผ ะปะพะบ, ะตัะปะธ ะฝะต ะฒัะฟะพะปะฝะตะฝะฝะพ
// ัะปะพะถะฝะพะต ััะปะพะฒะธะต. ะ ะถะดะตะผ ะฟะพะบะฐ ะบัะพ-ะฝะธะฑัะดั ัะดะตะปะฐะตั Pulse / PulseAll.
while (!CanIEat(i))
Monitor.Wait(_lock);
forks[Left(i)] = i + 1;
forks[Right(i)] = i + 1;
_waitTimes[i] = null;
}
finally
{
if (lockTaken) Monitor.Exit(_lock);
}
}
void PutForks(int i)
{
// ะขะพ ะถะต ัะฐะผะพะต: lock (_lock) {..}.
bool lockTaken = false;
Monitor.Enter(_lock, ref lockTaken);
try
{
forks[Left(i)] = 0;
forks[Right(i)] = 0;
// ะัะฒะพะฑะพะดะธัั ะฒัะต ะฟะพัะพะบะธ ะฒ ะพัะตัะตะดะธ ะะะกะะ ะฒัะทะพะฒะฐ Monitor.Exit.
Monitor.PulseAll(_lock);
}
finally
{
if (lockTaken) Monitor.Exit(_lock);
}
}
เจเฉฑเจฅเฉ เจ เจธเฉเจ เจซเฉเจฐเจ เจคเฉฑเจ เจชเจนเฉเฉฐเจ เจฒเจ เจชเฉเจฐเฉ เจธเจพเจฐเจฃเฉ เจจเฉเฉฐ เจฆเฉเจฌเจพเจฐเจพ เจฌเจฒเฉเจ เจเจฐ เจฐเจนเฉ เจนเจพเจ, เจชเจฐ เจนเฉเจฃ เจ เจธเฉเจ เจธเจพเจฐเฉ เจฅเจฐเจฟเฉฑเจกเจพเจ เจจเฉเฉฐ เจเฉฑเจ เจตเจพเจฐ เจตเจฟเฉฑเจ เจ เจจเจฌเจฒเฉเจ เจเจฐ เจฐเจนเฉ เจนเจพเจ, เจจเจพ เจเจฟ เจเฉเจเจเจขเฉเจเจ เจจเฉเฉฐ เจเจฆเฉเจ เจเฉเจ เจเจพเจฃเจพ เจเจคเจฎ เจเจฐเจฆเจพ เจนเฉเฅค เจเจน. เจชเจนเจฟเจฒเจพเจ, เจเฉเจ เจเจพเจเจฆเจพ เจนเฉ เจ เจคเฉ เจเฉเจเจเจขเฉเจเจ เจจเฉเฉฐ เจฐเฉเจเจฆเจพ เจนเฉ, เจ เจคเฉ เจเจฆเฉเจ เจเจน เจเจคเจฎ เจนเฉ เจเจพเจเจฆเจพ เจนเฉ, เจชเจฐ เจคเฉเจฐเฉฐเจค เจฆเฉเจฌเจพเจฐเจพ เจเจพเจฃเจพ เจเจพเจนเฉเฉฐเจฆเจพ เจนเฉ, เจคเจพเจ เจเจน เจฌเจฒเจพเจเจฟเฉฐเจ เจตเจฟเฉฑเจ เจเจพเจเจฆเจพ เจนเฉ เจ เจคเฉ เจเจชเจฃเฉ เจเฉเจเจเจขเฉเจเจ เจจเฉเฉฐ เจเจเจพเจเจเจฆเจพ เจนเฉ, เจเจฟเจเจเจเจฟ. เจเจธเจฆเฉ เจเจกเฉเจ เจธเจฎเจพเจ เจเฉฑเจ เจนเฉเฅค
เจเจธ เจคเจฐเฉเจนเจพเจ เจ
เจธเฉเจ เจเจฟเจธเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจฆเฉ เจ
เฉเจเจจ เจ
เจคเฉ เจญเฉเฉฑเจเจฎเจฐเฉ เจคเฉเจ เจฌเจเจฆเฉ เจนเจพเจเฅค เจ
เจธเฉเจ เจฅเฉเฉเฉเจนเฉ เจธเจฎเฉเจ เจฒเจ เจฒเฉเจช เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ เจ
เจคเฉ เจฒเฉฐเจฌเฉ เจธเจฎเฉเจ เจฒเจ เจฅเจฐเจฟเฉฑเจก เจจเฉเฉฐ เจฌเจฒเฉเจ เจเจฐเจฆเฉ เจนเจพเจเฅค เจธเจพเจฐเจฟเจเจ เจจเฉเฉฐ เจเฉฑเจ เจตเจพเจฐ 'เจคเฉ เจ
เจจเจฌเจฒเฉเจ เจเจฐเจจเจพ เจเจธ เจจเจพเจฒเฉเจ เจนเฉเจฒเฉ เจนเฉ เจเฉเจเจฐ เจธเจฟเจฐเจซเจผ เจเฉเจเจเจขเฉ เจจเฉเฉฐ เจ
เจจเจฌเจฒเฉเจ เจเฉเจคเจพ เจเจฟเจ เจธเฉ, เจเจฟเจตเฉเจ เจเจฟ เจเจธ เจฆเฉ เจนเฉฑเจฒ เจตเจฟเฉฑเจ เจนเฉ AutoResetEvent
, เจชเจฐ เจ
เฉฐเจคเจฐ เจตเฉฑเจกเจพ เจจเจนเฉเจ เจนเฉเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉ, เจเจฟเจเจเจเจฟ เจฅเจฐเจฟเฉฑเจกเจพเจ เจจเฉเฉฐ เจชเจนเจฟเจฒเจพเจ เจเจชเจญเฉเจเจคเจพ เจฎเฉเจก เจตเจฟเฉฑเจ เจฐเจนเจฟเจฃเจพ เจเจพเจนเฉเจฆเจพ เจนเฉเฅค
ะฃ lock
เจธเฉฐเจเฉเจเจธ เจตเจฟเฉฑเจ เจเฉฐเจฆเฉ เจนเฉเจฐเจพเจจเฉ เจนเจจเฅค เจตเจฐเจคเจฃ เจฆเฉ เจธเจฟเจซเจพเจฐเจธเจผ เจเจฐเจฆเฉ เจนเจจ Monitor
เจธเจฟเฉฑเจงเฉ [เจฐเจฟเจเจเจฐ] [เจเจฐเจฟเจ เจฒเจฟเจชเจฐเจ]เฅค เจเจจเฉเจนเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉฑเจ เจเจน เจนเฉ lock
เจนเจฎเฉเจธเจผเจพ เจฌเจพเจนเจฐ Monitor
, เจญเจพเจตเฉเจ เจเฉเจ เจ
เจชเจตเจพเจฆ เจธเฉ, เจเจฟเจธ เจธเจฅเจฟเจคเฉ เจตเจฟเฉฑเจ เจเฉเจ เจนเฉเจฐ เจฅเฉเจฐเฉเจก เจธเจพเจเจเฉ เจฎเฉเจฎเฉเจฐเฉ เจธเจฅเจฟเจคเฉ เจจเฉเฉฐ เจฌเจฆเจฒ เจธเจเจฆเจพ เจนเฉเฅค เจ
เจเจฟเจนเฉ เจฎเจพเจฎเจฒเจฟเจเจ เจตเจฟเฉฑเจ, เจกเฉเฉฑเจกเจฒเจพเจ เจตเจฟเฉฑเจ เจเจพเจฃเจพ เจเจพเจ เจเจฟเจธเฉ เจคเจฐเฉเจนเจพเจ เจธเฉเจฐเฉฑเจเจฟเจ
เจค เจขเฉฐเจ เจจเจพเจฒ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจจเฉเฉฐ เจเจคเจฎ เจเจฐเจจเจพ เจ
เจเจธเจฐ เจฌเจฟเจนเจคเจฐ เจนเฉเฉฐเจฆเจพ เจนเฉเฅค เจเฉฑเจ เจนเฉเจฐ เจนเฉเจฐเจพเจจเฉ เจเจน เจนเฉ เจเจฟ เจฎเจพเจจเฉเจเจฐ เจธเจฟเฉฐเจเฉเจฐเฉเจจเจพเจเจเจผเฉเจธเจผเจจ เจฌเจฒเจพเจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเจพ เจนเฉ (SyncBlock
), เจเฉ เจธเจพเจฐเฉเจเจ เจตเจธเจคเฉเจเจ เจตเจฟเฉฑเจ เจฎเฉเจเฉเจฆ เจนเจจเฅค เจเจธ เจฒเจ, เจเฉเจเจฐ เจเฉเจ เจ
เจฃเจเจเจฟเจค เจตเจธเจคเฉ เจเฉเจฃเฉ เจเจพเจเจฆเฉ เจนเฉ, เจคเจพเจ เจคเฉเจธเฉเจ เจเจธเจพเจจเฉ เจจเจพเจฒ เจเฉฑเจ เจกเฉเฉฑเจกเจฒเจพเจ เจชเฉเจฐเจพเจชเจค เจเจฐ เจธเจเจฆเฉ เจนเฉ (เจเจฆเจพเจนเจฐเจฃ เจฒเจ, เจเฉเจเจฐ เจคเฉเจธเฉเจ เจเฉฑเจ เจ
เฉฐเจฆเจฐเฉเจจเฉ เจธเจคเจฐ 'เจคเฉ เจฒเจพเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ)เฅค เจ
เจธเฉเจ เจเจธเจฆเฉ เจฒเจ เจนเจฎเฉเจธเจผเจพ เจฒเฉเจเฉ เจนเฉเจ เจตเจธเจคเฉ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจเฅค
เจเฉฐเจกเฉเจธเจผเจจ เจตเฉเจฐเฉเจเจฌเจฒ เจชเฉเจเจฐเจจ เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจธเจฅเจฟเจคเฉ เจฆเฉ เจเจฎเฉเจฆ เจจเฉเฉฐ เจนเฉเจฐ เจธเฉฐเจเฉเจช เจฐเฉเจช เจตเจฟเฉฑเจ เจฒเจพเจเฉ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉเฅค .NET เจตเจฟเฉฑเจ, เจเจน เจ เจงเฉเจฐเจพ เจนเฉ, เจฎเฉเจฐเฉ เจฐเจพเจ เจตเจฟเฉฑเจ, เจเจฟเจเจเจเจฟ เจฅเจฟเจเจฐเฉ เจตเจฟเฉฑเจ, เจเจ เจตเฉเจฐเฉเจเจฌเจฒเจพเจ เจเฉฑเจคเฉ เจเจ เจเจคเจพเจฐเจพเจ เจนเฉเจฃเฉเจเจ เจเจพเจนเฉเจฆเฉเจเจ เจนเจจ (เจเจฟเจตเฉเจ เจเจฟ เจชเฉเจธเจฟเจเจธ เจฅเฉเจฐเฉเจกเจธ เจตเจฟเฉฑเจ), เจจเจพ เจเจฟ เจเฉฑเจ เจฒเฉเจ เจเฉฑเจคเฉเฅค เจซเจฟเจฐ เจเฉเจ เจเจนเจจเจพเจ เจจเฉเฉฐ เจธเจพเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจเจพเจ เจฒเจ เจฌเจฃเจพ เจธเจเจฆเจพ เจนเฉเฅค เจชเจฐ เจเจธ เจซเจพเจฐเจฎ เจตเจฟเฉฑเจ เจตเฉ, เจเจน เจคเฉเจนเจพเจจเฉเฉฐ เจเฉเจก เจจเฉเฉฐ เจเจเจพเจเจฃ เจฆเฉ เจเจเจฟเจ เจฆเจฟเฉฐเจฆเจพ เจนเฉ.
เจฌเจนเฉเจค เจธเจพเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจ async
/ await
เจ เฉเจ เจนเฉ, เจนเฉเจฃ เจ เจธเฉเจ เจฅเจฐเจฟเฉฑเจกเจพเจ เจจเฉเฉฐ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ เจขเฉฐเจ เจจเจพเจฒ เจฌเจฒเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเจพเจเฅค เจชเจฐ เจเจฆเฉเจ เจเฉ เจเฉ เจธเจพเจกเฉ เจเฉเจฒ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจฆเจพเจฐเจธเจผเจจเจฟเจ เจนเจจ? 100? 10000? เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจธเจพเจจเฉเฉฐ เจตเฉเฉฑเจฌ เจธเจฐเจตเจฐ เจจเฉเฉฐ 100000 เจฌเฉเจจเจคเฉเจเจ เจชเฉเจฐเจพเจชเจค เจนเฉเจเจเจ เจนเจจเฅค เจนเจฐเฉเจ เจฌเฉเจจเจคเฉ เจฒเจ เจเฉฑเจ เจฅเจฐเจฟเฉฑเจก เจฌเจฃเจพเจเจฃเจพ เจเจตเจฐเจนเฉเฉฑเจก เจนเฉเจตเฉเจเจพ, เจเจฟเจเจเจเจฟ เจเฉฐเจจเฉ เจธเจพเจฐเฉ เจฅเฉเจฐเฉเฉฑเจก เจธเจฎเจพเจจเจพเจเจคเจฐ เจจเจนเฉเจ เจเฉฑเจฒเจฃเจเฉเฅค เจธเจฟเจฐเจซ เจเจจเฉ เจนเฉ เจเฉฑเจฒเจฃเจเฉ เจเจฟเฉฐเจจเฉ เจฒเจพเจเจผเฉเจเจฒ เจเฉเจฐ เจนเจจ (เจฎเฉเจฐเฉ เจเฉเจฒ 4 เจนเจจ)เฅค เจ เจคเฉ เจฌเจพเจเฉ เจนเจฐ เจเฉเจ เจตเจธเฉเจฒเฉ เจเฉเจน เจฒเจตเฉเจเจพเฅค เจเจธ เจธเจฎเฉฑเจธเจฟเจ เจฆเจพ เจเฉฑเจ เจนเฉฑเจฒ async/await เจชเฉเจเจฐเจจ เจนเฉเฅค เจเจธเจฆเจพ เจตเจฟเจเจพเจฐ เจเจน เจนเฉ เจเจฟ เจซเฉฐเจเจธเจผเจจ เจฅเจฐเจฟเฉฑเจก เจจเฉเฉฐ เจจเจนเฉเจ เจฐเฉฑเจเจฆเจพ เจนเฉ เจเฉเจเจฐ เจเจธเจจเฉเฉฐ เจเจพเจฐเฉ เจฐเฉฑเจเจฃ เจฒเจ เจเจฟเจธเฉ เจเฉเจเจผ เจฆเฉ เจเจกเฉเจ เจเจฐเจจเฉ เจชเฉเจเจฆเฉ เจนเฉ. เจ เจคเฉ เจเจฆเฉเจ เจเจน เจเฉเจ เจเจฐเจฆเจพ เจนเฉ, เจเจน เจเจธเจฆเฉ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจจเฉเฉฐ เจฎเฉเฉ เจธเจผเฉเจฐเฉ เจเจฐเจฆเจพ เจนเฉ (เจชเจฐ เจเจผเจฐเฉเจฐเฉ เจจเจนเฉเจ เจเจฟ เจเจธเฉ เจงเจพเจเฉ 'เจคเฉ!) เจธเจพเจกเฉ เจเฉเจธ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจซเฉเจฐเจ เจฆเฉ เจเจกเฉเจ เจเจฐเจพเจเจเฉ.
SemaphoreSlim
เจเจธ เจฒเจ เจนเฉ WaitAsync()
เจขเฉฐเจ. เจเฉฑเจฅเฉ เจเจธ เจชเฉเจเจฐเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจเฉ เจเฉฑเจ เจฒเจพเจเฉเจเจฐเจจ เจนเฉเฅค
// ะะฐะฟััะบ ัะฐะบะพะน ะถะต, ะบะฐะบ ัะฐะฝััะต. ะะดะต-ะฝะธะฑัะดั ะฒ ะฟัะพะณัะฐะผะผะต:
Task.Run(() => Run(i, cancelTokenSource.Token));
// ะะฐะฟััะบ ัะธะปะพัะพัะฐ.
// ะะปััะตะฒะพะต ัะปะพะฒะพ async -- ะบะพะผะฟะธะปััะพั ััะฐะฝัะปะธััะตั ััะพั ะผะตัะพั ะฒ ะฐัะธะฝั
ัะพะฝะฝัะน.
public async Task Run(int i, CancellationToken token)
{
while (true)
{
// await -- ะฑัะดะตะผ ะพะถะธะดะฐัั ะบะฐะบะพะณะพ-ัะพ ัะพะฑััะธั.
await TakeForks(i);
// ะะพัะปะต await, ะฟัะพะดะพะปะถะตะฝะธะต ะฒะพะทะผะพะถะฝะพ ะฒ ะดััะณะพะผ ะฟะพัะพะบะต.
eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
// ะะพะถะตั ะฑััั ะฝะตัะบะพะปัะบะพ ัะพะฑััะธะน ะดะปั ะพะถะธะดะฐะฝะธั.
await PutForks(i);
Think(i);
if (token.IsCancellationRequested) break;
}
}
async Task TakeForks(int i)
{
bool hasForks = false;
while (!hasForks)
{
// ะะทะฐะธะผะพะธัะบะปััะฐััะธะน ะดะพัััะฟ ะบ ััะพะปั:
await _tableSemaphore.WaitAsync();
if (forks[Left(i)] == 0 && forks[Right(i)] == 0)
{
forks[Left(i)] = i+1;
forks[Right(i)] = i+1;
hasForks = true;
}
_tableSemaphore.Release();
// ะัะดะตะผ ะพะถะธะดะฐัั, ััะพะฑั ัะพัะตะด ะฟะพะปะพะถะธะป ะฒะธะปะบะธ:
if (!hasForks)
await _philosopherSemaphores[i].WaitAsync();
}
}
// ะะดะตะผ ะดะพัััะฟะฐ ะบ ััะพะปั ะธ ะบะปะฐะดะตะผ ะฒะธะปะบะธ.
async Task PutForks(int i)
{
await _tableSemaphore.WaitAsync();
forks[Left(i)] = 0;
// "ะัะพะฑัะดะธัั" ัะพัะตะดะตะน, ะตัะปะธ ะพะฝะธ "ัะฟะฐะปะธ".
_philosopherSemaphores[LeftPhilosopher(i)].Release();
forks[Right(i)] = 0;
_philosopherSemaphores[RightPhilosopher(i)].Release();
_tableSemaphore.Release();
}
เจจเจพเจฒ เจตเจฟเจงเฉ async
/ await
เจเฉฑเจ เจเจฒ เจธเจเฉเจ เจฎเจธเจผเฉเจจ เจตเจฟเฉฑเจ เจ
เจจเฉเจตเจพเจฆ เจเฉเจคเจพ เจเจฟเจ เจนเฉ เจเฉ เจคเฉเจฐเฉฐเจค เจเจธเจฆเฉ เจ
เฉฐเจฆเจฐเฉเจจเฉ เจตเจพเจชเจธ เจเจฐ เจฆเจฟเฉฐเจฆเจพ เจนเฉ Task
. เจเจธเจฆเฉ เจฆเฉเจเจฐเจพ, เจคเฉเจธเฉเจ เจตเจฟเจงเฉ เจฆเฉ เจชเฉเจฐเจพ เจนเฉเจฃ เจฆเฉ เจเจกเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจเจธเจจเฉเฉฐ เจฐเฉฑเจฆ เจเจฐ เจธเจเจฆเฉ เจนเฉ, เจ
เจคเฉ เจนเฉเจฐ เจธเจญ เจเฉเจ เจเฉ เจคเฉเจธเฉเจ เจเจพเจธเจ เจจเจพเจฒ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค เจตเจฟเจงเฉ เจฆเฉ เจ
เฉฐเจฆเจฐ, เจฐเจพเจ เจฎเจธเจผเฉเจจ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจจเฉเฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจเจฐเจฆเฉ เจนเฉ. เจคเจฒ เจฒเจพเจเจจ เจเจน เจนเฉ เจเจฟ เจเฉเจเจฐ เจเฉเจ เจฆเฉเจฐเฉ เจจเจนเฉเจ เจนเฉ, เจคเจพเจ เจเจเจเจผเฉเจเจฟเจเจธเจผเจจ เจธเจฎเจเจพเจฒเฉ เจนเฉ, เจ
เจคเฉ เจเฉเจเจฐ เจนเฉ, เจคเจพเจ เจฅเจฐเจฟเฉฑเจก เจเจพเจฐเฉ เจเฉเจคเจพ เจเจพเจเจฆเจพ เจนเฉ. เจเจธ เจจเฉเฉฐ เจเฉฐเจเฉ เจคเจฐเฉเจนเจพเจ เจธเจฎเจเจฃ เจฒเจ, เจเจธ เจฐเจพเจ เจฎเจธเจผเฉเจจ เจจเฉเฉฐ เจตเฉเจเจฃเจพ เจฌเจฟเจนเจคเจฐ เจนเฉ. เจคเฉเจธเฉเจ เจเจนเจจเจพเจ เจคเฉเจ เจเฉเจจ เจฌเจฃเจพ เจธเจเจฆเฉ เจนเฉ async
/ await
เจขเฉฐเจ.
เจเจ เจเฉเจธเจ เจเจฐเฉเจเฅค 100 เจฒเจพเจเจผเฉเจเจฒ เจเฉเจฐ, 4 เจธเจเจฟเฉฐเจเจพเจ เจตเจพเจฒเฉ เจฎเจธเจผเฉเจจ 'เจคเฉ 8 เจซเจฟเจฒเจพเจธเจซเจฐเจพเจ เจฆเจพ เจเฉฐเจฎเฅค เจฎเจพเจจเฉเจเจฐ เจฆเฉ เจจเจพเจฒ เจชเจฟเจเจฒเจพ เจนเฉฑเจฒ เจธเจฟเจฐเจซ เจชเจนเจฟเจฒเฉ 4 เจฅเจฐเจฟเฉฑเจกเจพเจ เจจเฉเฉฐ เจเจฒเจพเจเจเจฆเจพ เจธเฉ เจ เจคเฉ เจฌเจพเจเฉ เจฌเจฟเจฒเจเฉเจฒ เจจเจนเฉเจ เจเฉฑเจฒเจฆเจพ เจธเฉเฅค เจเจนเจจเจพเจ 4 เจฅเจฐเจฟเฉฑเจกเจพเจ เจตเจฟเฉฑเจเฉเจ เจนเจฐ เจเฉฑเจ เจฒเจเจญเจ 2ms เจฒเจ เจตเจฟเจนเจฒเจพ เจธเฉเฅค เจ เจคเฉ async/await เจฆเจพ เจนเฉฑเจฒ 100 เจธเจเจฟเฉฐเจเจพเจ เจฆเฉ เจเจธเจค เจเจกเฉเจ เจฆเฉ เจจเจพเจฒ, เจธเจพเจฐเฉ 6.8 เจเฉฑเจฒเจฟเจเฅค เจฌเฉเจธเจผเฉฑเจ, เจ เจธเจฒ เจชเฉเจฐเจฃเจพเจฒเฉเจเจ เจตเจฟเฉฑเจ, 6 เจธเจเจฟเฉฐเจเจพเจ เจฒเจ เจจเจฟเจธเจผเจเจฟเจฐเจฟเจ เจ เจธเจตเฉเจเจพเจฐเจจเจฏเฉเจ เจนเฉ เจ เจคเฉ เจเจธ เจคเจฐเฉเจนเจพเจ เจฆเฉเจเจ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจฌเฉเจจเจคเฉเจเจ 'เจคเฉ เจเจพเจฐเจตเจพเจ เจจเจพ เจเจฐเจจเจพ เจฌเจฟเจนเจคเจฐ เจนเฉเฅค เจฎเจพเจจเฉเจเจฐ เจตเจพเจฒเจพ เจนเฉฑเจฒ เจฌเจฟเจฒเจเฉเจฒ เจตเฉ เจธเจเฉเจฒเฉเจฌเจฒ เจจเจนเฉเจ เจจเจฟเจเจฒเจฟเจเฅค
เจธเจฟเฉฑเจเจพ
เจเจฟเจตเฉเจ เจเจฟ เจคเฉเจธเฉเจ เจเจนเจจเจพเจ เจเฉเจเฉเจเจ เจเจฆเจพเจนเจฐเจฃเจพเจ เจคเฉเจ เจฆเฉเจ เจธเจเจฆเฉ เจนเฉ, .NET เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจธเจฎเจเจพเจฒเฉ เจเจธเจพเจฐเฉเจเจ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจเจฐเจฆเจพ เจนเฉเฅค เจนเจพเจฒเจพเจเจเจฟ, เจเจน เจนเจฎเฉเจธเจผเจพ เจธเจชเฉฑเจธเจผเจ เจจเจนเฉเจ เจนเฉเฉฐเจฆเจพ เจเจฟ เจเจนเจจเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจตเฉเจ เจเจฐเจจเฉ เจนเฉเฅค เจฎเฉเจจเฉเฉฐ เจเจฎเฉเจฆ เจนเฉ เจเจฟ เจเจน เจฒเฉเจ เจฎเจฆเจฆเจเจพเจฐ เจธเฉ. เจนเฉเจฃ เจฒเจ, เจเจน เจ เฉฐเจค เจนเฉ, เจชเจฐ เจ เจเฉ เจตเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉเจเจ เจฆเจฟเจฒเจเจธเจช เจเฉเจเจผเจพเจ เจฌเจพเจเฉ เจนเจจ, เจเจฆเจพเจนเจฐเจจ เจฒเจ, เจฅเจฐเจฟเฉฑเจก-เจธเฉเจฐเฉฑเจเจฟเจ เจค เจธเฉฐเจเฉเจฐเจนเจฟ, TPL เจกเฉเจเจพเจซเจฒเฉ, เจฐเจฟเจเจเจเจฟเจต เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ, เจธเฉเจซเจเจตเฉเจ เจฐ เจเฉเจฐเจพเจเจเฉเจเจธเจผเจจ เจฎเจพเจกเจฒ, เจเจฆเจฟเฅค
เจธเจฐเฉเจค
- เจชเฉเจฐเจตเจพเจน เจตเจฟเจเจผเฉเจ
เจฒเจพเจเจเจผเฉเจธเจผเจจ:
เจธเจฎเจฐเฉเจชเจคเจพ เจตเจฟเจเจผเฉเจ เจฒเจพเจเจเจผเจฐ - MSDN:
เจฅเฉเจฐเฉเจกเจฟเฉฐเจ ,เจ เจธเจฟเฉฐเจเฉเจฐเฉเจจเจธ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจชเฉเจเจฐเจจ เจ เจคเฉ เจนเฉเจฐ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจกเจพ. - [เจฐเจฟเจเจเจฐ] - C# เจฆเฉเจเจฐเจพ CLR, เจเฉเจซเจฐเฉ เจฐเจฟเจเจเจฐ
- [เจเจฐเจฟเจ เจฒเจฟเจชเจฐเจ] -
เจฒเจพเจ เจฌเจพเจฐเฉ เจธเจฐเฉเจค เจเฉเจก - เจคเจธเจตเฉเจฐ - "เจคเจฒเจตเจพเจฐเจพเจ เจตเจฟเจเจเจพเจฐ เจจเฉฑเจเฉ", เจเฉ. เจธเฉเจฎเฉเจฐเจพเจกเจธเจเฉ
เจธเจฐเฉเจค: www.habr.com