เจตเฉˆเจฒ-เจซเฉˆเจก เจซเจฟเจฒเจพเจธเจซเจฐ เจœเจพเจ‚ เจชเฉเจฐเจคเฉ€เจฏเฉ‹เจ—เฉ€ .NET เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจตเฉˆเจฒ-เจซเฉˆเจก เจซเจฟเจฒเจพเจธเจซเจฐ เจœเจพเจ‚ เจชเฉเจฐเจคเฉ€เจฏเฉ‹เจ—เฉ€ .NET เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจ†เจ“ เจฆเฉ‡เจ–เฉ€เจ เจ•เจฟ .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เฅค

เจตเฉˆเจฒ-เจซเฉˆเจก เจซเจฟเจฒเจพเจธเจซเจฐ เจœเจพเจ‚ เจชเฉเจฐเจคเฉ€เจฏเฉ‹เจ—เฉ€ .NET เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจšเจฟเฉฑเจคเจฐ เจตเจฟเฉฑเจš, เจฌเจฒเจพเจ•เจฟเฉฐเจ— เจฅเจฐเจฟเฉฑเจก (เจกเฉˆเฉฑเจกเจฒเจพเจ•)เฅค เจ—เฉเจฐเฉ€เจจ - เจเจ—เจœเจผเฉ€เจ•เจฟเจŠเจธเจผเจจ, เจฒเจพเจฒ - เจธเจฟเฉฐเจ•เฉเจฐเฉ‹เจจเจพเจˆเจœเจผเฉ‡เจธเจผเจจ, เจธเจฒเฉ‡เจŸเฉ€ - เจฅเจฐเจฟเฉฑเจก เจธเฉเฉฑเจคเจพ เจนเฉ‹เจ‡เจ† เจนเฉˆ. เจฐเฉ‹เจฎเจฌเจธ เจŸเจพเจธเจ• เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚เจ†เจคเฉ€ เจธเจฎเฉ‡เจ‚ เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจเฅค

เจซเจฟเจฒเจพเจธเจซเจฐเจพเจ‚ เจฆเฉ€ เจญเฉเฉฑเจ–

เจนเจพเจฒเจพเจ‚เจ•เจฟ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเจนเฉเจคเจพ เจญเฉ‹เจœเจจ เจธเฉ‹เจšเจฃเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจญเฉเฉฑเจ– เจ•เจฟเจธเฉ‡ เจจเฉ‚เฉฐ เจตเฉ€ เจซเจฒเจธเจซเฉ‡ เจจเฉ‚เฉฐ เจ›เฉฑเจก เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆเฅค เจ†เจ‰ เจธเจพเจกเฉ€ เจธเจฎเฉฑเจธเจฟเจ† เจตเจฟเฉฑเจš เจฅเจฐเจฟเฉฑเจกเจพเจ‚ เจฆเฉ€ เจญเฉเฉฑเจ–เจฎเจฐเฉ€ เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจฆเฉ€ เจจเจ•เจฒ เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ. เจญเฉเฉฑเจ–เจฎเจฐเฉ€ เจ‰เจฆเฉ‹เจ‚ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจ‡เฉฑเจ• เจงเจพเจ—เจพ เจšเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจชเจฐ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจ•เฉฐเจฎ เจฆเฉ‡ เจฌเจฟเจจเจพเจ‚, เจฆเฉ‚เจœเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš, เจ‡เจน เจ‰เจนเฉ€ เจกเฉˆเฉฑเจกเจฒเจพเจ• เจนเฉˆ, เจธเจฟเจฐเจซ เจนเฉเจฃ เจงเจพเจ—เจพ เจธเฉเฉฑเจคเจพ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเจฐ เจธเจฐเจ—เจฐเจฎเฉ€ เจจเจพเจฒ เจ–เจพเจฃ เจฒเจˆ เจ•เฉเจ เจฒเฉฑเจญ เจฐเจฟเจนเจพ เจนเฉˆ, เจชเจฐ เจ•เฉ‹เจˆ เจญเฉ‹เจœเจจ เจจเจนเฉ€เจ‚ เจนเฉˆ. เจตเจพเจฐ-เจตเจพเจฐ เจฌเจฒเจพเจ•เจฟเฉฐเจ— เจคเฉ‹เจ‚ เจฌเจšเจฃ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจ…เจธเฉ€เจ‚ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจจเจนเฉ€เจ‚ เจฒเฉˆ เจธเจ•เจฆเฉ‡ เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจซเฉ‹เจฐเจ• เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจฐเฉฑเจ– เจฆเจฟเจ†เจ‚เจ—เฉ‡เฅค

// ะขะพ ะถะต ั‡ั‚ะพ ะธ ะฒ 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 เจ—เฉเจฃเจพ เจ˜เฉฑเจŸ เจ–เจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‡เจธ เจฒเจˆ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจ›เฉ‹เจŸเฉ€ เจœเจฟเจนเฉ€ เจ—เจฒเจคเฉ€ เจ•เจพเจฐเจ—เฉเจœเจผเจพเจฐเฉ€ เจตเจฟเฉฑเจš เจ—เจฟเจฐเจพเจตเจŸ เจตเฉฑเจฒ เจ–เฉœเจฆเฉ€ เจนเฉˆ. เจ‡เฉฑเจฅเฉ‡ เจ‡เจน เจตเฉ€ เจงเจฟเจ†เจจ เจฆเฉ‡เจฃ เจฏเฉ‹เจ— เจนเฉˆ เจ•เจฟ เจ‡เฉฑเจ• เจฆเฉเจฐเจฒเฉฑเจญ เจธเจฅเจฟเจคเฉ€ เจธเฉฐเจญเจต เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจธเจพเจฐเฉ‡ เจฆเจพเจฐเจธเจผเจจเจฟเจ• เจ–เฉฑเจฌเจพ เจ•เจพเจ‚เจŸเจพ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจจ, เจ•เฉ‹เจˆ เจตเฉ€ เจธเฉฑเจœเจพ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ, เจ‰เจน เจ–เฉฑเจฌเฉ‡ เจชเจพเจธเฉ‡ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจจ, เจ‰เจกเฉ€เจ• เจ•เจฐเจฆเฉ‡ เจนเจจ, เจ–เฉฑเจฌเฉ‡ เจชเจพเจธเฉ‡ เจจเฉ‚เฉฐ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเจจ, เจ†เจฆเจฟเฅค เจ‡เจน เจธเจฅเจฟเจคเฉ€ เจ‡เฉฑเจ• เจญเฉเฉฑเจ–เจฎเจฐเฉ€ เจตเฉ€ เจนเฉˆ, เจ‡เฉฑเจ• เจกเฉˆเฉฑเจกเจฒเจพเจ• เจตเจฐเจ—เฉ€. เจฎเฉˆเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจฆเฉเจนเจฐเจพเจ‰เจฃ เจตเจฟเฉฑเจš เจ…เจธเจซเจฒ เจฐเจฟเจนเจพเฅค เจนเฉ‡เจ เจพเจ‚ เจ‡เฉฑเจ• เจ…เจœเจฟเจนเฉ€ เจธเจฅเจฟเจคเฉ€ เจฒเจˆ เจ‡เฉฑเจ• เจคเจธเจตเฉ€เจฐ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจฆเฉ‹ เจฌเฉเจฐเฉ‡ เจฆเจพเจฐเจธเจผเจจเจฟเจ•เจพเจ‚ เจจเฉ‡ เจฆเฉ‹เจจเฉ‹ เจ•เจพเจ‚เจŸเฉ‡ เจฒเจ เจนเจจ เจ…เจคเฉ‡ เจฆเฉ‹ เจšเฉฐเจ—เฉ‡ เจญเฉเฉฑเจ–เฉ‡ เจฎเจฐ เจฐเจนเฉ‡ เจนเจจเฅค

เจตเฉˆเจฒ-เจซเฉˆเจก เจซเจฟเจฒเจพเจธเจซเจฐ เจœเจพเจ‚ เจชเฉเจฐเจคเฉ€เจฏเฉ‹เจ—เฉ€ .NET เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจ‡เฉฑเจฅเฉ‡ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจฅเจฐเจฟเฉฑเจก เจ•เจˆ เจตเจพเจฐ เจœเจพเจ—เจฆเฉ‡ เจนเจจ เจ…เจคเฉ‡ เจธเจฐเฉ‹เจค เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเฉ‡ เจนเจจ. เจšเจพเจฐ เจ•เฉ‹เจฐเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฆเฉ‹ เจ•เฉเจ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ (เจ‰เจชเจฐเฉ‹เจ•เจค เจนเจฐเจพ เจ—เฉเจฐเจพเจซ)เฅค

เจ‡เฉฑเจ• เจซเจฟเจฒเจพเจธเจซเจฐ เจฆเฉ€ เจฎเฉŒเจค

เจ–เฉˆเจฐ, เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจธเจฎเฉฑเจธเจฟเจ† เจœเฉ‹ เจฆเจพเจฐเจธเจผเจจเจฟเจ•เจพเจ‚ เจฆเฉ‡ เจธเจผเจพเจจเจฆเจพเจฐ เจฐเจพเจค เจฆเฉ‡ เจ–เจพเจฃเฉ‡ เจตเจฟเฉฑเจš เจตเจฟเจ˜เจจ เจชเจพ เจธเจ•เจฆเฉ€ เจนเฉˆ เจ‰เจน เจนเฉˆ เจœเฉ‡เจ•เจฐ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ…เจšเจพเจจเจ• เจ‰เจธเจฆเฉ‡ เจนเฉฑเจฅเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจพเจ‚เจŸเฉ‡ เจจเจพเจฒ เจฎเจฐ เจœเจพเจ‚เจฆเจพ เจนเฉˆ (เจ…เจคเฉ‡ เจ‰เจน เจ‰เจธเจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจซเจจเจพเจ‰เจฃเจ—เฉ‡)เฅค เจซเจฟเจฐ เจ—เฉเจ†เจ‚เจขเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจฐเจพเจค เจฆเฉ‡ เจ–เจพเจฃเฉ‡ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจ›เฉฑเจก เจฆเจฟเฉฑเจคเจพ เจœเจพเจตเฉ‡เจ—เจพ. เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ†เจช เจจเฉ‚เฉฐ เจ‡เจธ เจ•เฉ‡เจธ เจฒเจˆ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจ•เฉ‹เจก เจฆเฉ‡ เจจเจพเจฒ เจ† เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เจธเจจเฉ‚เฉฐ เจฌเจพเจนเจฐ เจธเฉเฉฑเจŸ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† เจนเฉˆ 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 (เจœเฉ‹ เจ‰เฉฑเจฅเฉ‡ เจตเจฐเจคเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ)เฅค เจนเฉเจฃ เจ‰เจน เจœเจพเจฃเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‰เจกเฉ€เจ• เจ•เจฐเจจ เจตเจพเจฒเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจ—เจฟเจฃเจจเจพ เจนเฉˆ, เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‚เฉฐ เจฅเฉ‹เฉœเจพ เจœเจฟเจนเจพ เจธเฉŒเจฃเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจตเฉ€ เจฌเจนเฉเจค เจ•เฉเจเฅค เจ†เจฆเจฟเฅค เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡, เจ…เจจเฉเจ•เฉ‚เจฒ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจนเจฐ เจธเฉฐเจญเจต เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจชเจฐ เจธเจพเจจเฉ‚เฉฐ เจ‡เจน เจฏเจพเจฆ เจฐเฉฑเจ–เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ…เจœเฉ‡ เจตเฉ€ เจ‰เจนเฉ€ เจ•เจฟเจฐเจฟเจ†เจธเจผเฉ€เจฒ เจšเฉฑเจ•เจฐ เจนเฉˆ เจœเฉ‹ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฐ เจธเจฐเฉ‹เจคเจพเจ‚ เจจเฉ‚เฉฐ เจ–เจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจชเฉเจฐเจตเจพเจน เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจจเจพเจฒ เจญเฉเฉฑเจ–เจฎเจฐเฉ€ เจนเฉ‹ เจธเจ•เจฆเฉ€ เจนเฉˆ เจœเฉ‡เจ•เจฐ เจฆเจพเจฐเจธเจผเจจเจฟเจ•เจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจฆเฉ‚เจœเจฟเจ†เจ‚ เจจเจพเจฒเฉ‹เจ‚ เจตเจงเฉ‡เจฐเฉ‡ เจคเจฐเจœเฉ€เจน เจฌเจฃ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจชเจฐ เจ‡เฉฑเจ• เจธเฉเจจเจนเจฟเจฐเฉ€ เจซเฉ‹เจฐเจ• เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเจพ (เจชเฉเจฐเจพเจ‡เจฐเจฟเจŸเฉ€ เจ‡เจจเจตเจฐเจœเจผเจจ เจธเจฎเฉฑเจธเจฟเจ†) . เจ‡เจธ เจฒเจˆ, เจ…เจธเฉ€เจ‚ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจธเจพเจ‚เจเฉ€ เจ•เฉ€เจคเฉ€ เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจตเจฟเฉฑเจš เจฌเจนเฉเจค เจนเฉ€ เจ›เฉ‹เจŸเฉ€เจ†เจ‚ เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฒเจˆ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจคเฉ€เจœเฉ€-เจงเจฟเจฐ เจ•เจพเจฒเจพเจ‚, เจจเฉ‡เจธเจŸเจก เจฒเจพเจ• เจ…เจคเฉ‡ เจนเฉ‹เจฐ เจนเฉˆเจฐเจพเจจเฉ€ เจฆเฉ‡เฅค

เจตเฉˆเจฒ-เจซเฉˆเจก เจซเจฟเจฒเจพเจธเจซเจฐ เจœเจพเจ‚ เจชเฉเจฐเจคเฉ€เจฏเฉ‹เจ—เฉ€ .NET เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—

เจฒเจˆ เจกเจฐเจพเจ‡เฉฐเจ— 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 เจกเฉ‡เจŸเจพเจซเจฒเฉ‹, เจฐเจฟเจเจ•เจŸเจฟเจต เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ—, เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจŸเฉเจฐเจพเจ‚เจœเฉˆเจ•เจธเจผเจจ เจฎเจพเจกเจฒ, เจ†เจฆเจฟเฅค

เจธเจฐเฉ‹เจค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹