แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ’แƒแƒ›แƒแƒ™แƒ•แƒ”แƒ‘แƒแƒ“แƒ˜ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒ˜ แƒแƒœ แƒ™แƒแƒœแƒ™แƒฃแƒ แƒ”แƒœแƒขแƒฃแƒœแƒแƒ แƒ˜แƒแƒœแƒ˜ .NET แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ

แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ’แƒแƒ›แƒแƒ™แƒ•แƒ”แƒ‘แƒแƒ“แƒ˜ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒ˜ แƒแƒœ แƒ™แƒแƒœแƒ™แƒฃแƒ แƒ”แƒœแƒขแƒฃแƒœแƒแƒ แƒ˜แƒแƒœแƒ˜ .NET แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ

แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒแƒ’แƒแƒ  แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก แƒ™แƒแƒœแƒ™แƒฃแƒ แƒ”แƒœแƒขแƒฃแƒšแƒ˜ แƒ“แƒ แƒžแƒแƒ แƒแƒšแƒ”แƒšแƒฃแƒ แƒ˜ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ .Net-แƒจแƒ˜, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ—แƒ แƒกแƒแƒกแƒแƒ“แƒ˜แƒšแƒ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒ’แƒ”แƒ’แƒ›แƒ แƒแƒกแƒ”แƒ—แƒ˜แƒ, แƒซแƒแƒคแƒ”แƒ‘แƒ˜แƒก/แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ’แƒแƒœ, แƒแƒฅแƒขแƒแƒ แƒ˜แƒก แƒ›แƒแƒ“แƒ”แƒšแƒแƒ›แƒ“แƒ” (แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒจแƒ˜). แƒกแƒขแƒแƒขแƒ˜แƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒงแƒแƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ’แƒแƒชแƒœแƒแƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒœ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒชแƒแƒ“แƒœแƒ˜แƒก แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ แƒแƒขแƒแƒ› แƒแƒ™แƒ”แƒ—แƒ”แƒ‘ แƒกแƒแƒ”แƒ แƒ—แƒแƒ“? แƒขแƒ แƒแƒœแƒ–แƒ˜แƒกแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒ›แƒ˜แƒแƒฆแƒฌแƒ”แƒ•แƒ”แƒœ แƒ›แƒ˜แƒœแƒ˜แƒ›แƒแƒšแƒฃแƒ  แƒ–แƒแƒ›แƒแƒก, แƒ›แƒฃแƒ แƒ˜แƒก แƒ™แƒแƒœแƒแƒœแƒ˜ แƒ”แƒ›แƒงแƒแƒ แƒ”แƒ‘แƒ แƒกแƒ˜แƒœแƒแƒ—แƒšแƒ˜แƒก แƒกแƒ˜แƒฉแƒฅแƒแƒ แƒ˜แƒก แƒจแƒ”แƒ–แƒฆแƒฃแƒ“แƒ•แƒแƒก แƒ“แƒ แƒแƒ›แƒ˜แƒขแƒแƒ› แƒจแƒ”แƒ˜แƒœแƒ˜แƒจแƒœแƒ”แƒ‘แƒ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒก แƒ–แƒ แƒ“แƒ, แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒ”แƒขแƒ˜ แƒขแƒ แƒแƒœแƒ–แƒ˜แƒกแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ. แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ แƒ“แƒ แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ แƒ›แƒงแƒ˜แƒกแƒ˜แƒ”แƒ  แƒžแƒแƒกแƒฃแƒฎแƒก แƒ”แƒšแƒ˜แƒแƒœ. แƒแƒกแƒ”แƒ— แƒกแƒ˜แƒขแƒฃแƒแƒชแƒ˜แƒแƒจแƒ˜ โ€žแƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜โ€œ แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ, แƒ แƒแƒชแƒ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒ”แƒ แƒ—แƒ˜ แƒจแƒ”แƒ›แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ”แƒšแƒ˜ แƒ—แƒ”แƒ›แƒ, แƒแƒฆแƒแƒ  แƒแƒ แƒ˜แƒก แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒ˜. แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ แƒแƒ’แƒแƒ แƒ›แƒ” แƒ’แƒแƒ“แƒแƒญแƒ แƒแƒ— แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒ˜ แƒแƒœ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ. แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒ˜แƒช, แƒ”แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒกแƒฎแƒ•แƒแƒ“แƒแƒกแƒฎแƒ•แƒ แƒ“แƒแƒœแƒ”แƒ–แƒ”: แƒซแƒแƒคแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ”, แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ”, แƒฅแƒกแƒ”แƒšแƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒฅแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒœแƒ”แƒ–แƒ” (แƒ’แƒแƒœแƒแƒฌแƒ˜แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒ˜). .NET-แƒก แƒแƒฅแƒ•แƒก แƒ›แƒแƒฆแƒแƒšแƒ˜ แƒฎแƒแƒ แƒ˜แƒกแƒฎแƒ˜แƒก, แƒ“แƒ แƒแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒชแƒ“แƒ˜แƒšแƒ˜ แƒขแƒ”แƒฅแƒœแƒแƒšแƒแƒ’แƒ˜แƒ”แƒ‘แƒ˜ แƒแƒกแƒ”แƒ—แƒ˜ แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒกแƒฌแƒ แƒแƒคแƒแƒ“ แƒ“แƒ แƒ”แƒคแƒ”แƒฅแƒขแƒฃแƒ แƒแƒ“ แƒ’แƒแƒ“แƒแƒญแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก.

แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ

Edsger Dijkstra-แƒ› แƒ”แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ แƒ—แƒแƒ•แƒ˜แƒก แƒกแƒขแƒฃแƒ“แƒ”แƒœแƒขแƒ”แƒ‘แƒก แƒฏแƒ”แƒ  แƒ™แƒ˜แƒ“แƒ”แƒ• 1965 แƒฌแƒ”แƒšแƒก แƒ“แƒแƒฃแƒกแƒ•แƒ. แƒฉแƒแƒ›แƒแƒงแƒแƒšแƒ˜แƒ‘แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒคแƒแƒ แƒ›แƒฃแƒšแƒ˜แƒ แƒ”แƒ‘แƒ แƒแƒกแƒ”แƒ—แƒ˜แƒ. แƒแƒ แƒ˜แƒก แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ (แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒฎแƒฃแƒ—แƒ˜) แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒ“แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ•แƒ” แƒฉแƒแƒœแƒ’แƒแƒšแƒ˜. แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒกแƒฎแƒ”แƒ“แƒแƒœ แƒ›แƒ แƒ’แƒ•แƒแƒš แƒ›แƒแƒ’แƒ˜แƒ“แƒแƒกแƒ—แƒแƒœ, แƒฉแƒแƒœแƒ’แƒšแƒ”แƒ‘แƒ˜ แƒ›แƒแƒ— แƒจแƒแƒ แƒ˜แƒก. แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒก แƒจแƒ”แƒฃแƒซแƒšแƒ˜แƒแƒ— แƒ—แƒแƒ•แƒ˜แƒแƒœแƒ—แƒ˜ แƒ—แƒ”แƒคแƒจแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒญแƒแƒ›แƒ แƒ’แƒแƒฃแƒ—แƒแƒ•แƒ”แƒ‘แƒ”แƒšแƒ˜ แƒกแƒแƒ™แƒ•แƒ”แƒ‘แƒ˜, แƒ˜แƒคแƒ˜แƒฅแƒ แƒแƒœ แƒแƒœ แƒ“แƒแƒ”แƒšแƒแƒ“แƒแƒœ. แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜แƒก แƒกแƒแƒญแƒ›แƒ”แƒšแƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒแƒ˜แƒฆแƒแƒ— แƒแƒ แƒ˜ แƒฉแƒแƒœแƒ’แƒแƒšแƒ˜ (แƒ‘แƒแƒšแƒ แƒฉแƒแƒœแƒ’แƒแƒšแƒก แƒฃแƒ–แƒ˜แƒแƒ แƒ”แƒ‘แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒก). แƒฉแƒแƒœแƒ’แƒšแƒ˜แƒก แƒแƒฌแƒ”แƒ•แƒ แƒ“แƒ แƒฉแƒแƒ›แƒแƒ’แƒ“แƒ”แƒ‘แƒ แƒแƒ แƒ˜ แƒชแƒแƒšแƒ™แƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒ. แƒงแƒ•แƒ”แƒšแƒ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜ แƒ“แƒฃแƒ›แƒก. แƒแƒ›แƒแƒชแƒแƒœแƒแƒ แƒ˜แƒกแƒ”แƒ—แƒ˜ แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜แƒก แƒžแƒแƒ•แƒœแƒ, แƒ แƒแƒ› แƒงแƒ•แƒ”แƒšแƒ แƒ˜แƒคแƒ˜แƒฅแƒ แƒแƒก แƒ“แƒ แƒกแƒแƒ•แƒกแƒ” แƒ˜แƒงแƒแƒก 54 แƒฌแƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒแƒช แƒ™แƒ˜.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒจแƒ”แƒ•แƒ”แƒชแƒแƒ“แƒแƒ— แƒแƒ› แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒญแƒ แƒ แƒกแƒแƒ–แƒ˜แƒแƒ แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒ—. แƒฉแƒแƒœแƒ’แƒšแƒ”แƒ‘แƒ˜ แƒ“แƒ”แƒ•แƒก แƒกแƒแƒ”แƒ แƒ—แƒ แƒ›แƒแƒ’แƒ˜แƒ“แƒแƒ–แƒ” แƒ“แƒ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒ˜ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ˜แƒฆแƒ”แƒ‘แƒ”แƒœ แƒ›แƒแƒ—, แƒ แƒแƒชแƒ แƒแƒ แƒ˜แƒแƒœ แƒ“แƒ แƒฃแƒ™แƒแƒœ แƒแƒ‘แƒ แƒฃแƒœแƒ”แƒ‘แƒ”แƒœ. แƒแƒฅ แƒแƒ แƒ˜แƒก แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ”แƒ‘แƒ˜, แƒ–แƒฃแƒกแƒขแƒแƒ“ แƒ แƒแƒ“แƒ˜แƒก แƒฃแƒœแƒ“แƒ แƒแƒ•แƒ˜แƒฆแƒแƒ— surebets? แƒ แƒ แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ, แƒ—แƒฃ แƒฉแƒแƒœแƒ’แƒแƒšแƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก? แƒ›แƒแƒ’แƒ แƒแƒ› แƒฏแƒ”แƒ  แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒ˜.

แƒซแƒแƒคแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ”แƒ‘แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒซแƒแƒคแƒ˜แƒก แƒแƒฃแƒ–แƒก 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 แƒฅแƒ›แƒœแƒ˜แƒก แƒแƒœ แƒจแƒšแƒ˜แƒก แƒซแƒแƒคแƒ”แƒ‘แƒก แƒแƒ› แƒแƒ›แƒแƒชแƒแƒœแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ˜แƒก แƒ›แƒ˜แƒฎแƒ”แƒ“แƒ•แƒ˜แƒ—. แƒ”แƒ แƒ—แƒ˜ แƒแƒฃแƒ–แƒ˜ แƒงแƒ•แƒ”แƒšแƒ AppDomain-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ”แƒก แƒแƒฃแƒ–แƒ˜ แƒฃแƒœแƒ“แƒ แƒ˜แƒฅแƒœแƒแƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ—แƒ˜แƒ—แƒฅแƒ›แƒ˜แƒก แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ’แƒแƒœ. แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ—แƒ”แƒ›แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ, แƒฌแƒแƒจแƒšแƒ, แƒ›แƒแƒ—แƒ˜ แƒ แƒ˜แƒ’แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ.แƒจ. 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 (แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฅ แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ). แƒแƒฎแƒšแƒ แƒ›แƒแƒœ แƒ˜แƒชแƒ˜แƒก แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ—แƒ•แƒแƒšแƒแƒก แƒ›แƒแƒ›แƒšแƒแƒ“แƒ˜แƒœแƒ”แƒ”แƒ‘แƒ˜, แƒ“แƒแƒแƒซแƒ˜แƒœแƒแƒก แƒชแƒแƒขแƒ แƒ“แƒ แƒกแƒฎแƒ•แƒ. แƒ–แƒแƒ’แƒแƒ“แƒแƒ“, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒก แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒฃแƒœแƒ“แƒ แƒ’แƒ•แƒแƒฎแƒกแƒแƒ•แƒ“แƒ”แƒก, แƒ แƒแƒ› แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ˜ แƒชแƒ˜แƒ™แƒšแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒญแƒแƒ›แƒก แƒžแƒ แƒแƒชแƒ”แƒกแƒแƒ แƒ˜แƒก แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒก แƒ“แƒ แƒ˜แƒœแƒแƒ แƒฉแƒฃแƒœแƒ”แƒ‘แƒก แƒœแƒแƒ™แƒแƒ“แƒก, แƒ แƒแƒ›แƒแƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒแƒก แƒจแƒ˜แƒ›แƒจแƒ˜แƒšแƒ˜, แƒ—แƒฃ แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒ›แƒ” แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜ แƒ’แƒแƒฎแƒ“แƒ”แƒ‘แƒ แƒฃแƒคแƒ แƒ แƒžแƒ แƒ˜แƒแƒ แƒ˜แƒขแƒ”แƒขแƒฃแƒšแƒ˜ แƒ•แƒ˜แƒ“แƒ แƒ” แƒกแƒฎแƒ•แƒ”แƒ‘แƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ  แƒ”แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒฅแƒ แƒแƒก แƒฉแƒแƒœแƒ’แƒแƒšแƒ˜ (Priority Inversion-แƒ˜แƒก แƒžแƒ แƒแƒ‘แƒšแƒ”แƒ›แƒ) . แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒ–แƒ˜แƒแƒ แƒ แƒ›แƒ”แƒฎแƒกแƒ˜แƒ”แƒ แƒ”แƒ‘แƒแƒจแƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ™แƒšแƒ” แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒงแƒแƒ•แƒ”แƒšแƒ’แƒ•แƒแƒ แƒ˜ แƒ›แƒ”แƒกแƒแƒ›แƒ” แƒ›แƒฎแƒแƒ แƒ˜แƒก แƒ–แƒแƒ แƒ”แƒ‘แƒ˜แƒก, แƒฉแƒแƒ“แƒ’แƒ›แƒฃแƒšแƒ˜ แƒกแƒแƒ™แƒ”แƒขแƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒฃแƒ แƒžแƒ แƒ˜แƒ–แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

แƒ™แƒแƒ แƒ’แƒแƒ“ แƒ’แƒแƒ›แƒแƒ™แƒ•แƒ”แƒ‘แƒแƒ“แƒ˜ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒ˜ แƒแƒœ แƒ™แƒแƒœแƒ™แƒฃแƒ แƒ”แƒœแƒขแƒฃแƒœแƒแƒ แƒ˜แƒแƒœแƒ˜ .NET แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒ˜แƒ แƒ”แƒ‘แƒ

แƒฎแƒแƒขแƒ•แƒ แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก SpinLock. แƒœแƒแƒ™แƒแƒ“แƒฃแƒšแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒฃแƒ“แƒ›แƒ”แƒ‘แƒ˜แƒ— โ€žแƒ˜แƒ‘แƒ แƒซแƒ•แƒ˜แƒแƒœโ€œ แƒแƒฅแƒ แƒแƒก แƒฉแƒแƒœแƒ’แƒแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒแƒ แƒ˜แƒก แƒฌแƒแƒ แƒฃแƒ›แƒแƒขแƒ”แƒ‘แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ - แƒคแƒ˜แƒ’แƒฃแƒ แƒแƒจแƒ˜, แƒแƒ แƒฉแƒ”แƒฃแƒšแƒ˜ แƒขแƒ”แƒ แƒ˜แƒขแƒแƒ แƒ˜แƒ. แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ”แƒ‘แƒ˜ แƒกแƒ แƒฃแƒšแƒแƒ“ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒšแƒ˜: แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— 2/3 แƒแƒ› แƒแƒ—แƒฎแƒ˜ แƒซแƒแƒคแƒ˜แƒ—.

แƒแƒฅ แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ”แƒ แƒ—แƒ˜ แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ Interlocked.CompareExchange แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ˜ แƒ›แƒแƒšแƒแƒ“แƒ˜แƒœแƒ˜แƒ—, แƒ แƒแƒ’แƒแƒ แƒช แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒชแƒ”แƒ›แƒฃแƒš แƒ™แƒแƒ“แƒจแƒ˜แƒ แƒœแƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ˜ (แƒ›แƒจแƒ˜แƒ”แƒ แƒ˜ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ”แƒ‘แƒจแƒ˜), แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒœ, แƒ แƒแƒ’แƒแƒ แƒช แƒฃแƒ™แƒ•แƒ” แƒ˜แƒ—แƒฅแƒ•แƒ, แƒ—แƒ”แƒแƒ แƒ˜แƒฃแƒšแƒแƒ“ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒ˜แƒฌแƒ•แƒ˜แƒแƒก แƒ“แƒแƒ‘แƒšแƒแƒ™แƒ•แƒ.

on Interlocked แƒฃแƒœแƒ“แƒ แƒแƒฆแƒ˜แƒœแƒ˜แƒจแƒœแƒแƒก, แƒ แƒแƒ› แƒแƒ  แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ CompareExchange, แƒแƒ แƒแƒ›แƒ”แƒ“ แƒแƒขแƒแƒ›แƒฃแƒ แƒ˜ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒกแƒ แƒ“แƒ แƒฉแƒแƒฌแƒ”แƒ แƒ˜แƒก แƒกแƒฎแƒ•แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜แƒช. แƒ“แƒ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒ”แƒแƒ แƒ”แƒ‘แƒ˜แƒ—, แƒ˜แƒ› แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ—แƒฃ แƒกแƒฎแƒ•แƒ แƒ—แƒ”แƒ›แƒแƒก แƒแƒฅแƒ•แƒก แƒ“แƒ แƒ, แƒ แƒแƒ› แƒจแƒ”แƒ˜แƒขแƒแƒœแƒแƒก แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜ (แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— 1, แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒ”แƒ— 2, แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— 2, แƒฉแƒแƒฌแƒ”แƒ แƒ”แƒ— 1 แƒชแƒฃแƒ“แƒ˜แƒ), แƒ˜แƒก แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒฃแƒš แƒ˜แƒฅแƒœแƒแƒก แƒ”แƒ แƒ—แƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ˜แƒก แƒ™แƒแƒ›แƒžแƒšแƒ”แƒฅแƒกแƒฃแƒ แƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก (Interlocked Anything pattern) .

แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ แƒ”แƒŸแƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜

แƒ˜แƒ›แƒ˜แƒกแƒแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ› แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒ•แƒ˜แƒชแƒ˜แƒšแƒแƒ— แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒฎแƒแƒ แƒฏแƒ•แƒ แƒ›แƒแƒ แƒงแƒฃแƒŸแƒจแƒ˜, แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒแƒ’แƒแƒ  แƒจแƒ”แƒ’แƒ•แƒ˜แƒซแƒšแƒ˜แƒ แƒ“แƒแƒ‘แƒšแƒแƒ™แƒแƒก แƒ—แƒ”แƒ›แƒ. แƒกแƒฎแƒ•แƒ แƒกแƒ˜แƒขแƒงแƒ•แƒ”แƒ‘แƒ˜แƒ— แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒ’แƒแƒ•แƒแƒ’แƒ แƒซแƒ”แƒšแƒแƒ— แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒ•แƒœแƒแƒฎแƒแƒ—, แƒ แƒแƒ’แƒแƒ  แƒแƒซแƒ˜แƒœแƒ”แƒ‘แƒก แƒ›แƒ˜แƒ›แƒขแƒแƒœแƒ˜ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒก แƒ“แƒ แƒแƒฆแƒ•แƒ˜แƒซแƒ”แƒ‘แƒก แƒ›แƒแƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒกแƒแƒญแƒ˜แƒ แƒแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜. แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒแƒ— แƒ”แƒก แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒฃแƒšแƒ˜ แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ˜แƒก แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒก แƒ แƒ”แƒŸแƒ˜แƒ›แƒจแƒ˜. แƒ˜แƒฅ แƒงแƒ•แƒ”แƒšแƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ แƒฎแƒจแƒ˜แƒ แƒแƒ“ แƒฃแƒคแƒ แƒ แƒœแƒ”แƒšแƒ˜แƒ แƒ•แƒ˜แƒ“แƒ แƒ” แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒจแƒ˜. แƒ แƒแƒ›แƒ“แƒ”แƒœแƒฏแƒ”แƒ แƒ›แƒ” แƒœแƒ”แƒšแƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ AutoResetEvent แƒจแƒ”แƒกแƒแƒซแƒšแƒแƒ 53-แƒฏแƒ”แƒ  แƒœแƒ”แƒšแƒ SpinLock [แƒ แƒ˜แƒฎแƒขแƒ”แƒ แƒ˜]. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ—แƒ˜ แƒ“แƒแƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ˜แƒ— แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒžแƒ แƒแƒชแƒ”แƒกแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ แƒ›แƒ—แƒ”แƒš แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒแƒจแƒ˜, แƒ›แƒแƒ แƒ—แƒ•แƒแƒ“แƒ˜ แƒ—แƒฃ แƒแƒ แƒ.

แƒซแƒ˜แƒ แƒ˜แƒ—แƒแƒ“แƒ˜ แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ แƒแƒฅ แƒแƒ แƒ˜แƒก แƒกแƒ”แƒ›แƒแƒคแƒแƒ แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ›แƒแƒ—แƒแƒ•แƒแƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒ˜แƒ™แƒกแƒขแƒ แƒแƒก แƒ›แƒ˜แƒ”แƒ  แƒœแƒแƒฎแƒ”แƒ•แƒแƒ แƒ˜ แƒกแƒแƒฃแƒ™แƒฃแƒœแƒ˜แƒก แƒฌแƒ˜แƒœ. แƒกแƒ”แƒ›แƒแƒคแƒแƒ แƒ˜, แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒแƒ แƒ˜แƒก แƒ“แƒแƒ“แƒ”แƒ‘แƒ˜แƒ—แƒ˜ แƒ›แƒ—แƒ”แƒšแƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ›แƒแƒ แƒ—แƒแƒ•แƒก แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒ“แƒ แƒ›แƒแƒกแƒ–แƒ” แƒแƒ แƒ˜ แƒแƒžแƒ”แƒ แƒแƒชแƒ˜แƒ, แƒ–แƒ แƒ“แƒ แƒ“แƒ แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒ. แƒ—แƒฃ แƒ˜แƒก แƒ•แƒ”แƒ  แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ“แƒ, แƒœแƒฃแƒšแƒแƒ•แƒแƒœแƒ˜, แƒ›แƒแƒจแƒ˜แƒœ แƒ–แƒแƒ แƒ˜แƒก แƒ—แƒ”แƒ›แƒ แƒ˜แƒ‘แƒšแƒแƒ™แƒ”แƒ‘แƒ. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜ แƒ˜แƒ–แƒ แƒ“แƒ”แƒ‘แƒ แƒกแƒฎแƒ•แƒ แƒแƒฅแƒขแƒ˜แƒฃแƒ แƒ˜ แƒซแƒแƒคแƒ˜แƒ—/แƒžแƒ แƒแƒชแƒ”แƒกแƒ˜แƒ—, แƒ›แƒแƒจแƒ˜แƒœ แƒซแƒแƒคแƒ”แƒ‘แƒ˜ แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒกแƒ”แƒ›แƒแƒคแƒแƒ แƒ˜ แƒ™แƒ•แƒšแƒแƒ• แƒ›แƒชแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ•แƒšแƒ˜แƒšแƒ˜ แƒ แƒ˜แƒชแƒฎแƒ•แƒ˜แƒ—. แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฌแƒแƒ แƒ›แƒแƒ•แƒ˜แƒ“แƒ’แƒ˜แƒœแƒแƒ— แƒ›แƒแƒขแƒแƒ แƒ”แƒ‘แƒšแƒ”แƒ‘แƒ˜ แƒ‘แƒแƒกแƒขแƒœแƒ”แƒฃแƒšแƒจแƒ˜ แƒกแƒ”แƒ›แƒแƒคแƒแƒ แƒ—แƒแƒœ. .NET แƒ’แƒ—แƒแƒ•แƒแƒ–แƒแƒ‘แƒ— แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒแƒก แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒ—: AutoResetEvent, ManualResetEvent, Mutex แƒ›แƒ” แƒ“แƒ แƒ›แƒ” Semaphore. แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— AutoResetEvent, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒแƒ› แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜: แƒ›แƒฎแƒแƒšแƒแƒ“ แƒแƒ แƒ˜ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ 0 แƒ“แƒ 1 (false, true). แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ WaitOne() แƒ‘แƒšแƒแƒ™แƒแƒ•แƒก แƒ’แƒแƒ›แƒแƒซแƒแƒฎแƒ”แƒ‘แƒ˜แƒก แƒ—แƒ”แƒ›แƒแƒก, แƒ—แƒฃ แƒ›แƒœแƒ˜แƒจแƒ•แƒœแƒ”แƒšแƒแƒ‘แƒ แƒ˜แƒงแƒ 0, แƒฎแƒแƒšแƒ แƒ—แƒฃ 1, แƒแƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒก แƒ›แƒแƒก 0-แƒ›แƒ“แƒ” แƒ“แƒ แƒ’แƒแƒ›แƒแƒขแƒแƒ•แƒ”แƒ‘แƒก แƒ›แƒแƒก. แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ Set() แƒแƒฌแƒ”แƒ•แƒก 1-แƒ›แƒ“แƒ” แƒ“แƒ แƒฃแƒจแƒ•แƒ”แƒ‘แƒก แƒ”แƒ แƒ— แƒ›แƒ˜แƒ›แƒขแƒแƒœแƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒกแƒ”แƒ• 0-แƒ›แƒ“แƒ” แƒ“แƒแƒ‘แƒšแƒ. แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒก แƒ แƒแƒ’แƒแƒ แƒช แƒ›แƒ”แƒขแƒ แƒแƒก แƒขแƒฃแƒ แƒœแƒ˜แƒ™แƒ˜.

แƒ›แƒแƒ“แƒ˜แƒ— แƒ’แƒแƒ•แƒแƒ แƒ—แƒฃแƒšแƒแƒ— แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ แƒ“แƒ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒแƒ— แƒกแƒแƒ™แƒ”แƒขแƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ“แƒ แƒแƒ แƒ แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“. แƒ˜แƒ›แƒแƒ—. แƒแƒฎแƒšแƒ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜ แƒ˜แƒงแƒแƒก แƒ”แƒ แƒ—แƒ“แƒ แƒแƒฃแƒšแƒแƒ“ แƒ“แƒ แƒแƒ แƒ แƒ”แƒ แƒ—แƒ˜. แƒ›แƒแƒ’แƒ แƒแƒ› แƒฉแƒ•แƒ”แƒœ แƒ™แƒ•แƒšแƒแƒ• แƒ•แƒ‘แƒšแƒแƒ™แƒแƒ•แƒ— แƒ›แƒแƒ’แƒ˜แƒ“แƒแƒ–แƒ” แƒฌแƒ•แƒ“แƒแƒ›แƒแƒก, แƒ แƒแƒ—แƒ แƒกแƒฌแƒแƒ แƒแƒ“, แƒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒแƒ•แƒ˜แƒชแƒ˜แƒšแƒแƒ— แƒ แƒ‘แƒแƒšแƒ (แƒ แƒ‘แƒแƒšแƒ˜แƒก แƒžแƒ˜แƒ แƒแƒ‘แƒ”แƒ‘แƒ˜), แƒแƒ•แƒ˜แƒฆแƒแƒ— surebets.

// ะ”ะปั ะฑะปะพะบะธั€ะพะฒะฐะฝะธั ะพั‚ะดะตะปัŒะฝะพะณะพ ั„ะธะปะพัะพั„ะฐ.
// ะ˜ะฝะธั†ะธะฐะปะธะทะธั€ัƒะตั‚ัั: 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 (mutex), แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒแƒ แƒงแƒฃแƒŸแƒจแƒ˜ แƒšแƒแƒ“แƒ˜แƒœแƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ“แƒแƒญแƒ”แƒ แƒ˜แƒ—, แƒ แƒ”แƒ™แƒฃแƒ แƒกแƒ˜แƒ˜แƒ—, Condition Variable แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜แƒ— (แƒ“แƒแƒฌแƒ•แƒ แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ— แƒแƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒฅแƒ•แƒ”แƒ›แƒแƒ—) แƒ“แƒ แƒ.แƒจ. แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฎแƒ”แƒ“แƒแƒ— แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒก.

// ะกะฟั€ัั‡ะตะผ ะพะฑัŠะตะบั‚ ะดะปั ะœะพะฝะธั‚ะพั€ะฐ ะพั‚ ะฒัะตั…, ั‡ั‚ะพะฑั‹ ะฑะตะท ะดะตะดะปะพะบะพะฒ.
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), แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒ˜แƒช แƒงแƒ•แƒ”แƒšแƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒจแƒ˜แƒ. แƒแƒ›แƒ˜แƒขแƒแƒ›, แƒ—แƒฃ แƒจแƒ”แƒ˜แƒ แƒฉแƒ”แƒ•แƒ แƒจแƒ”แƒฃแƒกแƒแƒ‘แƒแƒ›แƒ แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒ›แƒ˜แƒ˜แƒฆแƒแƒ— แƒฉแƒ˜แƒฎแƒ˜ (แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒ—แƒฃ แƒฉแƒแƒ™แƒ”แƒขแƒแƒ•แƒ— แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒก). แƒแƒ›แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒ“แƒแƒ›แƒแƒšแƒฃแƒš แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒก.

Condition Variable แƒœแƒ˜แƒ›แƒฃแƒจแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒฃแƒคแƒ แƒ แƒ›แƒแƒ™แƒšแƒ”แƒ“ แƒ’แƒแƒœแƒแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒแƒ— แƒ แƒแƒ˜แƒ›แƒ” แƒ แƒ—แƒฃแƒšแƒ˜ แƒ›แƒ“แƒ’แƒแƒ›แƒแƒ แƒ”แƒแƒ‘แƒ˜แƒก แƒ›แƒแƒšแƒแƒ“แƒ˜แƒœแƒ˜. .NET-แƒจแƒ˜ แƒ˜แƒก แƒแƒ แƒแƒกแƒ แƒฃแƒšแƒ˜แƒ, แƒฉแƒ”แƒ›แƒ˜ แƒแƒ–แƒ แƒ˜แƒ—, แƒ˜แƒ›แƒ˜แƒขแƒแƒ› แƒ—แƒ”แƒแƒ แƒ˜แƒฃแƒšแƒแƒ“, แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒ แƒ˜แƒ’แƒ˜ แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜แƒ›แƒ” แƒชแƒ•แƒšแƒแƒ“แƒ–แƒ” (แƒ แƒแƒ’แƒแƒ แƒช Posix Threads-แƒจแƒ˜), แƒ“แƒ แƒแƒ แƒ แƒ”แƒ แƒ— แƒšแƒแƒ™แƒ–แƒ”. แƒ›แƒแƒจแƒ˜แƒœ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ›แƒแƒ—แƒ˜ แƒ“แƒแƒ›แƒ–แƒแƒ“แƒ”แƒ‘แƒ แƒงแƒ•แƒ”แƒšแƒ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ› แƒคแƒแƒ แƒ›แƒ˜แƒ—แƒแƒช แƒ™แƒ˜, แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒจแƒ”แƒแƒ›แƒชแƒ˜แƒ แƒแƒ— แƒ™แƒแƒ“แƒ˜.

แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜ แƒแƒœ 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. แƒ›แƒ˜แƒกแƒ˜ แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ— แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ”แƒšแƒแƒ“แƒแƒ— แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒแƒก, แƒ’แƒแƒแƒฃแƒฅแƒ›แƒแƒ— แƒ˜แƒก แƒ“แƒ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜, แƒ แƒ˜แƒกแƒ˜ แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒแƒช แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— Task-แƒ˜แƒ—. แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒก แƒจแƒ˜แƒ’แƒœแƒ˜แƒ—, แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒ แƒแƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ‘แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒแƒก. แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ แƒ˜แƒก แƒแƒ แƒ˜แƒก, แƒ แƒแƒ› แƒ—แƒฃ แƒจแƒ”แƒคแƒ”แƒ แƒฎแƒ”แƒ‘แƒ แƒแƒ  แƒแƒ แƒ˜แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜แƒ, แƒฎแƒแƒšแƒ แƒ—แƒฃ แƒแƒ แƒ˜แƒก, แƒ›แƒแƒจแƒ˜แƒœ แƒซแƒแƒคแƒ˜ แƒ˜แƒฎแƒกแƒœแƒ”แƒ‘แƒ. แƒแƒ›แƒ˜แƒก แƒฃแƒ™แƒ”แƒ— แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒแƒ“ แƒกแƒฏแƒแƒ‘แƒก แƒแƒ› แƒกแƒแƒฎแƒ”แƒšแƒ›แƒฌแƒ˜แƒคแƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒก แƒ’แƒแƒ“แƒแƒ•แƒฎแƒ”แƒ“แƒแƒ—. แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒจแƒ”แƒฅแƒ›แƒœแƒแƒ— แƒฏแƒแƒญแƒ•แƒ”แƒ‘แƒ˜ แƒ›แƒแƒ—แƒ’แƒแƒœ async / await แƒ›แƒ”แƒ—แƒแƒ“แƒ”แƒ‘แƒ˜.

แƒ›แƒแƒ“แƒ˜ แƒ’แƒแƒ›แƒแƒ•แƒชแƒแƒ“แƒแƒ—. 100 แƒคแƒ˜แƒšแƒแƒกแƒแƒคแƒแƒกแƒ˜แƒก แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ แƒ›แƒแƒœแƒฅแƒแƒœแƒแƒ–แƒ” 4 แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜แƒ—, 8 แƒฌแƒแƒ›แƒ˜. แƒฌแƒ˜แƒœแƒ แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒ— แƒ›แƒฎแƒแƒšแƒแƒ“ แƒžแƒ˜แƒ แƒ•แƒ”แƒš 4 แƒ—แƒ”แƒ›แƒแƒก แƒแƒขแƒแƒ แƒ”แƒ‘แƒ“แƒ แƒ“แƒ แƒ“แƒแƒœแƒแƒ แƒฉแƒ”แƒœแƒ˜ แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒแƒ  แƒ’แƒแƒ“แƒ˜แƒแƒ“แƒ. แƒแƒ› 4 แƒซแƒแƒคแƒ˜แƒ“แƒแƒœ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒฃแƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ แƒ˜แƒงแƒ แƒ“แƒแƒแƒฎแƒšแƒแƒ”แƒ‘แƒ˜แƒ— 2 ms. แƒ“แƒ แƒแƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒฃแƒšแƒ˜/แƒ›แƒแƒšแƒแƒ“แƒ˜แƒœแƒ˜แƒก แƒ’แƒแƒ“แƒแƒฌแƒงแƒ•แƒ”แƒขแƒ แƒ’แƒแƒฃแƒจแƒ•แƒ 100-แƒ•แƒ”, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒจแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒแƒ“ 6.8 แƒฌแƒแƒ›แƒ˜แƒก แƒšแƒแƒ“แƒ˜แƒœแƒ˜. แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒ แƒ”แƒแƒšแƒฃแƒ  แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ”แƒ‘แƒจแƒ˜ 6 แƒฌแƒแƒ›แƒ˜แƒก แƒฃแƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒแƒ‘แƒ แƒ›แƒ˜แƒฃแƒฆแƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ“แƒ แƒฏแƒแƒ‘แƒ˜แƒ แƒแƒ›แƒ“แƒ”แƒœแƒ˜ แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒ แƒแƒ  แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ“แƒ”แƒก. แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒ— แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜ แƒกแƒแƒ”แƒ แƒ—แƒแƒ“ แƒแƒ  แƒ˜แƒงแƒ แƒ›แƒแƒกแƒจแƒขแƒแƒ‘แƒฃแƒ แƒ˜.

แƒ“แƒแƒกแƒ™แƒ•แƒœแƒ

แƒ แƒแƒ’แƒแƒ แƒช แƒแƒ› แƒ›แƒชแƒ˜แƒ แƒ” แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒฎแƒ”แƒ“แƒแƒ•แƒ—, .NET แƒ›แƒฎแƒแƒ แƒก แƒฃแƒญแƒ”แƒ แƒก แƒ›แƒ แƒแƒ•แƒแƒšแƒ˜ แƒกแƒ˜แƒœแƒฅแƒ แƒแƒœแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒ™แƒแƒœแƒกแƒขแƒ แƒฃแƒฅแƒชแƒ˜แƒแƒก. แƒ—แƒฃแƒ›แƒชแƒ, แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒแƒ  แƒแƒ แƒ˜แƒก แƒœแƒแƒ—แƒ”แƒšแƒ˜, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒ’แƒแƒ›แƒแƒ˜แƒงแƒ”แƒœแƒแƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜. แƒ˜แƒ›แƒ”แƒ“แƒ˜ แƒ›แƒแƒฅแƒ•แƒก, แƒ แƒแƒ› แƒ”แƒก แƒกแƒขแƒแƒขแƒ˜แƒ แƒกแƒแƒกแƒแƒ แƒ’แƒ”แƒ‘แƒšแƒ แƒ˜แƒงแƒ. แƒฏแƒ”แƒ แƒฏแƒ”แƒ แƒแƒ‘แƒ˜แƒ— แƒ”แƒก แƒ“แƒแƒกแƒแƒกแƒ แƒฃแƒšแƒ˜แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ™แƒ˜แƒ“แƒ”แƒ• แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒ แƒแƒ› แƒ“แƒแƒ แƒฉแƒ, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, thread-safe แƒ™แƒแƒšแƒ”แƒฅแƒชแƒ˜แƒ”แƒ‘แƒ˜, TPL Dataflow, Reactive programming, Software Transaction model แƒ“แƒ แƒ.แƒจ.

แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ˜แƒก แƒฌแƒงแƒแƒ แƒแƒ”แƒ‘แƒ˜

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ