เดจเดฒเตเดฒ เดซเดฟเดฒเต‹เดธเดซเตผ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดคเตเดธเดฐเดพเดงเดฟเดทเตเด เดฟเดค .NET เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต

เดจเดฒเตเดฒ เดซเดฟเดฒเต‹เดธเดซเตผ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดฎเดคเตเดธเดฐเดพเดงเดฟเดทเตเด เดฟเดค .NET เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต

เด‰เดšเตเดšเดญเด•เตเดทเดฃ เดคเดคเตเดคเตเดตเดšเดฟเดจเตเดคเด•เดฐเตเดŸเต† เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเตปเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต .เดจเต†เดฑเตเดฑเดฟเตฝ เดธเดฎเดพเดจเตเดคเดฐเดตเตเด‚ เดธเดฎเดพเดจเตเดคเดฐเดตเตเดฎเดพเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚. เดคเตเดฐเต†เดกเต/เดชเตเดฐเต‹เดธเดธเต เดธเดฟเตปเด•เตเดฐเตŠเดฃเตˆเดธเต‡เดทเตป เดฎเตเดคเตฝ เด†เด•เตเดŸเตผ เดฎเต‹เดกเตฝ เดตเดฐเต† (เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดญเดพเด—เด™เตเด™เดณเดฟเตฝ) เดชเตเดฒเดพเตป เด‡เดชเตเดฐเด•เดพเดฐเดฎเดพเดฃเต. เด†เดฆเตเดฏ เดชเดฐเดฟเดšเดฏเด•เตเด•เดพเดฐเดจเต‹ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด…เดฑเดฟเดตเต เดชเตเดคเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต‹ เดฒเต‡เด–เดจเด‚ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเด‚.

เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด‡เดคเต เดŽเด™เตเด™เดจเต† เดšเต†เดฏเตเดฏเดฃเดฎเต†เดจเตเดจเต เดชเต‹เดฒเตเด‚ เด…เดฑเดฟเดฏเตเดจเตเดจเดคเต? เดŸเตเดฐเดพเตปเดธเดฟเดธเตเดฑเตเดฑเดฑเตเด•เตพ เด…เดตเดฏเตเดŸเต† เดเดฑเตเดฑเดตเตเด‚ เด•เตเดฑเดžเตเดž เดตเดฒเตเดชเตเดชเดคเตเดคเดฟเตฝ เดŽเดคเตเดคเตเดจเตเดจเต, เดฎเต‚เดฑเดฟเตปเตเดฑเต† เดจเดฟเดฏเดฎเด‚ เดชเตเดฐเด•เดพเดถเดคเตเดคเดฟเตปเตเดฑเต† เดตเต‡เด—เดคเดฏเตเดŸเต† เดชเดฐเดฟเดงเดฟเดฏเดฟเตฝ เดŽเดคเตเดคเตเดจเตเดจเต, เด…เดคเดฟเดจเดพเตฝ เดธเด‚เด–เตเดฏเด•เดณเดฟเตฝ เดตเดณเตผเดšเตเดš เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต. เด…เดคเต‡ เดธเดฎเดฏเด‚, เดกเดพเดฑเตเดฑเดฏเตเดŸเต† เด…เดณเดตเต เดตเดณเดฐเตเด•เดฏเดพเดฃเต, เด•เต‚เดŸเดพเดคเต† เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เตพ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด‰เดŸเดจเดŸเดฟ เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต. เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, "เดธเดพเดงเดพเดฐเดฃ" เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต, เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเดฟเด‚เด—เต เดคเตเดฐเต†เดกเต เด‰เดณเตเดณเดชเตเดชเต‹เตพ, เด…เดคเต เดซเดฒเดชเตเดฐเดฆเดฎเดฒเตเดฒ. เด’เดฐเต‡เดธเดฎเดฏเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต‡เดธเดฎเดฏเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจ เดชเตเดฐเดถเตเดจเด‚ เดŽเด™เตเด™เดจเต†เดฏเต†เด™เตเด•เดฟเดฒเตเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดˆ เดชเตเดฐเดถเตเดจเด‚ เดตเดฟเดตเดฟเดง เดคเดฒเด™เตเด™เดณเดฟเตฝ เดจเดฟเดฒเดตเดฟเดฒเตเดฃเตเดŸเต: เดคเตเดฐเต†เดกเต เดคเดฒเดคเตเดคเดฟเตฝ, เดชเตเดฐเต‹เดธเดธเตเดธเต เดคเดฒเดคเตเดคเดฟเตฝ, เดจเต†เดฑเตเดฑเตเดตเตผเด•เตเด•เดฟเดฒเต† เดฎเต†เดทเต€เดจเตเด•เดณเตเดŸเต† เดคเดฒเดคเตเดคเดฟเตฝ (เดตเดฟเดคเดฐเดฃ เดธเด‚เดตเดฟเดงเดพเดจเด™เตเด™เตพ). เด‡เดคเตเดคเดฐเด‚ เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เตพ เดตเต‡เด—เดคเตเดคเดฟเดฒเตเด‚ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดฎเดพเดฏเตเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต .NET-เดจเต เด‰เดฏเตผเดจเตเดจ เดจเดฟเดฒเดตเดพเดฐเดฎเตเดณเตเดณเดคเตเด‚ เดธเดฎเดฏเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเดคเตเดฎเดพเดฏ เดธเดพเด™เตเด•เต‡เดคเดฟเด•เดตเดฟเดฆเตเดฏเด•เดณเตเดฃเตเดŸเต.

เดฒเด•เตเดทเตเดฏเด‚

Edsger Dijkstra 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, เดŽเดจเตเดจเดพเตฝ เดŽเดฒเตเดฒเดพเดคเตเดคเดฐเด‚ เดธเต—เด•เดฐเตเดฏเด™เตเด™เดณเต‹เดŸเตเด‚ เด•เต‚เดŸเดฟ: เดฎเดฑเตเดฑเต เดŸเดพเดธเตโ€Œเด•เตเด•เตเด•เดณเตเดŸเต† เด’เดฐเต เดฌเตเดฒเต‹เด•เตเด•เดฟเดจเต เดถเต‡เดทเด‚ เด’เดฐเต เดŸเดพเดธเตโ€Œเด•เตเด•เต เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต, เดซเด‚เด—เตเดทเดจเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เด…เดต เดคเดฟเดฐเดฟเด•เต† เดจเตฝเด•เตเด•, เดธเต—เด•เดฐเตเดฏเดชเต‚เตผเดตเตเดตเด‚ เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•, เด•เต‚เดŸเดพเดคเต† เดฎเดฑเตเดฑเต เดชเดฒเดคเตเด‚. เดฎเตเดคเดฒเดพเดฏเดต. เด…เดธเดฟเตปเด•เต/เดตเต†เดฏเตเดฑเตเดฑเต เด•เตบเดธเตเดŸเตเดฐเด•เตเดทเตปเดธเต (เดŸเดพเดธเตเด•เต เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เด…เดธเดฟเตปเด•เตเดฐเดฃเดธเต เดชเดพเดฑเตเดฑเต‡เตบ, เดเด’ เด“เดชเตเดชเดฑเต‡เดทเดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดตเดพเด•เตเดฏเด˜เดŸเดจ เดชเดžเตเดšเดธเดพเดฐ) เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด…เดต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด‡เดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดชเดฟเดจเตเดจเต€เดŸเต เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เดพเด‚.

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 [เดฑเดฟเด•เตเดŸเตผ]. เดŽเดจเตเดจเดพเตฝ เด…เดตเดฐเตเดŸเต† เดธเดนเดพเดฏเดคเตเดคเต‹เดŸเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฎเตเดดเตเดตเตป เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเดฟเดฒเตเดŸเดจเต€เดณเดฎเตเดณเตเดณ เดชเตเดฐเด•เตเดฐเดฟเดฏเด•เตพ เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚, เดฎเดพเดจเต‡เดœเต เดšเต†เดฏเตเดคเดพเดฒเตเด‚ เด…เดฒเตเดฒเดพเดคเต†เดฏเตเด‚.

เด…เดฐเดจเต‚เดฑเตเดฑเดพเดฃเตเดŸเดฟเดฒเต‡เดฑเต† เดฎเตเดฎเตเดชเต Dijkstra เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเดšเตเดš เด’เดฐเต เดธเต†เดฎเดพเดซเต‹เดฑเดพเดฃเต เด‡เดตเดฟเดŸเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ. เด’เดฐเต เดธเต†เดฎเดพเดซเต‹เตผ, เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดชเดฑเดžเตเดžเดพเตฝ, เดธเดฟเดธเตเดฑเตเดฑเด‚ เดจเดฟเดฏเดจเตเดคเตเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดชเต‹เดธเดฟเดฑเตเดฑเต€เดตเต เดชเต‚เตผเดฃเตเดฃเดธเด‚เด–เตเดฏเดฏเดพเดฃเต, เด…เดคเดฟเตฝ เดฐเดฃเตเดŸเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เตพ - เด•เต‚เดŸเตเดŸเตเด•เดฏเตเด‚ เด•เตเดฑเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดชเต‚เดœเตเดฏเด‚ เด•เตเดฑเดฏเตเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เด•เต‹เดณเดฟเด‚เด—เต เดคเตเดฐเต†เดกเต เดคเดŸเดžเตเดžเต. เดฎเดฑเตเดฑเต‡เดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเดœเต€เดตเดฎเดพเดฏ เดคเตเดฐเต†เดกเต/เดชเตเดฐเด•เตเดฐเดฟเดฏ เดตเดดเดฟ เดธเด‚เด–เตเดฏ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดคเตเดฐเต†เดกเตเด•เตพ เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเด•เดฏเตเด‚ เดธเต†เดฎเดพเดซเต‹เตผ เดชเดพเดธเตเดธเดพเดฏ เดธเด‚เด–เตเดฏเดฏเดพเตฝ เดตเต€เดฃเตเดŸเตเด‚ เด•เตเดฑเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดธเต†เดฎเดพเดซเต‹เดฑเตเดณเตเดณ เด’เดฐเต เด•เตเดชเตเดชเดฟเดตเดณเดฏเดฟเตฝ เดŸเตเดฐเต†เดฏเดฟเดจเตเด•เดณเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเด™เตเด•เตฝเดชเตเดชเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚. เดธเดฎเดพเดจเดฎเดพเดฏ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดคเดฏเตเดณเตเดณ เดจเดฟเดฐเดตเดงเดฟ เดจเดฟเตผเดฎเตเดฎเดพเดฃเด™เตเด™เตพ .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 เด‰เดฃเตเดŸเต). เดฎเดฑเตเดฑเต†เดฒเตเดฒเดพเดตเดฐเตเด‚ เดตเดฟเดญเดตเด™เตเด™เตพ เดŽเดŸเตเดคเตเดคเตเด•เดณเดฏเตเด‚. เดˆ เดชเตเดฐเดถเตเดจเดคเตเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเดฐเดฟเดนเดพเดฐเดฎเดพเดฃเต เด…เดธเดฟเตปเด•เต / เดตเต†เดฏเดฟเดฑเตเดฑเต เดชเดพเดฑเตเดฑเต‡เตบ. เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดคเตเดŸเดฐเดพเตป เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดซเด‚เด—เตโ€Œเดทเตป เด’เดฐเต เดคเตเดฐเต†เดกเต เด•เตˆเดตเดถเด‚ เดตเดฏเตเด•เตเด•เดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเดพเดฃเต เด…เดคเดฟเตปเตเดฑเต† เด†เดถเดฏเด‚. เดŽเดจเตเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เด…เดคเต เด…เดคเดฟเตปเตเดฑเต† เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เดชเตเดจเดฐเดพเดฐเด‚เดญเดฟเด•เตเด•เตเดจเตเดจเต (เดŽเดจเตเดจเดพเตฝ เด…เดคเต‡ เดคเตเดฐเต†เดกเดฟเตฝ เด†เดฏเดฟเดฐเดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเดฟเดฒเตเดฒ!). เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดžเด™เตเด™เตพ เด’เดฐเต เดจเดพเตฝเด•เตเด•เดตเดฒเดฏเตเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด‚.

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 เดคเตเดฐเต†เดกเตเด•เดณเดฟเตฝ เด“เดฐเต‹เดจเตเดจเตเด‚ เดเด•เดฆเต‡เดถเด‚ 2 เดฎเดฟ. เด•เต‚เดŸเดพเดคเต†, เด…เดธเดฟเตปเด•เต / เดตเต†เดฏเดฟเดฑเตเดฑเต เดธเตŠเดฒเตเดฏเต‚เดทเตป 100 เดŽเดฒเตเดฒเดพเด‚ เดšเต†เดฏเตเดคเต, เดถเดฐเดพเดถเดฐเดฟ 6.8 เดธเต†เด•เตเด•เตปเดกเต เด“เดฐเต‹ เด•เดพเดคเตเดคเดฟเดฐเดฟเดชเตเดชเตเด‚. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดฏเดฅเดพเตผเดคเตเดฅ เดธเดฟเดธเตเดฑเตเดฑเด™เตเด™เดณเดฟเตฝ, 6 เดธเต†เด•เตเด•เตปเดกเต เดจเดฟเดทเตโ€Œเด•เตเดฐเดฟเดฏเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เด…เดธเตเดตเต€เด•เดพเดฐเตเดฏเดฎเดพเดฃเต, เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ เด‡เดคเตเดฐเดฏเตเด‚ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เดˆ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดชเตเดฐเต‹เดธเดธเตเดธเต เดšเต†เดฏเตเดฏเดพเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดพเดฃเต เดจเดฒเตเดฒเดคเต. เดฎเต‹เดฃเดฟเดฑเตเดฑเดฑเตเดฎเดพเดฏเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเด‚ เดธเตเด•เต†เดฏเดฟเดฒเดฌเดฟเตพ เด…เดฒเตเดฒเต†เดจเตเดจเต เดคเต†เดณเดฟเดžเตเดžเต.

เดคเต€เดฐเตเดฎเดพเดจเด‚

เดˆ เดšเต†เดฑเดฟเดฏ เด‰เดฆเดพเดนเดฐเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, .NET เดจเดฟเดฐเดตเดงเดฟ เดธเดฟเตปเด•เตเดฐเตŠเดฃเตˆเดธเต‡เดทเตป เดจเดฟเตผเดฎเตเดฎเดพเดฃเด™เตเด™เดณเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เด…เดต เดŽเด™เตเด™เดจเต† เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเดฎเต†เดจเตเดจเต เดŽเดฒเตเดฒเดพเดฏเตเดชเตเดชเต‹เดดเตเด‚ เดตเตเดฏเด•เตเดคเดฎเดฒเตเดฒ. เดˆ เดฒเต‡เด–เดจเด‚ เดธเดนเดพเดฏเด•เดฐเดฎเดพเดฃเต†เดจเตเดจเต เดžเดพเตป เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เตพ เด‡เดคเต เด‡เดชเตเดชเต‹เตพ เดชเตŠเดคเดฟเดฏเตเด•เดฏเดพเดฃเต, เดŽเดจเตเดจเดพเตฝ เด‡เดจเดฟเดฏเตเด‚ เดฐเดธเด•เดฐเดฎเดพเดฏ เด’เดฐเตเดชเดพเดŸเต เด•เดพเดฐเตเดฏเด™เตเด™เตพ เดฌเดพเด•เตเด•เดฟเดฏเตเดฃเตเดŸเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดคเตเดฐเต†เดกเต-เดธเต‡เดซเต เด•เดณเด•เตเดทเดจเตเด•เตพ, TPL เดกเดพเดฑเตเดฑเดซเตเดฒเต‹, เดฑเดฟเดฏเดพเด•เตเดŸเต€เดตเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต, เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เด‡เดŸเดชเดพเดŸเต เดฎเต‹เดกเตฝ เดฎเตเดคเดฒเดพเดฏเดต.

เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•