āĻ­āĻžāĻ˛-āĻĢā§‡āĻĄ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻŦāĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ• .NET āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚

āĻ­āĻžāĻ˛-āĻĢā§‡āĻĄ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻŦāĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ• .NET āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚

āĻ†āĻ¸ā§āĻ¨ āĻĻā§‡āĻ–āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¸āĻŽāĻ¸āĻžāĻŽāĻ¯āĻŧāĻŋāĻ• āĻāĻŦāĻ‚ āĻ¸āĻŽāĻžāĻ¨ā§āĻ¤āĻ°āĻžāĻ˛ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ .Net-āĻ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ āĻĢāĻŋāĻ˛ā§‹āĻ¸āĻĢāĻžāĻ°ā§āĻ¸ āĻĄāĻžāĻ‡āĻ¨āĻŋāĻ‚ āĻĒā§āĻ°āĻŦāĻ˛ā§‡āĻŽ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻĒāĻ°āĻŋāĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻšāĻ˛ āĻāĻ‡, āĻĨā§āĻ°ā§‡āĻĄ/āĻĒā§āĻ°āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻ…āĻ­āĻŋāĻ¨ā§‡āĻ¤āĻž āĻŽāĻĄā§‡āĻ˛ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ (āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ…āĻ‚āĻļā§‡)āĨ¤ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻœā§āĻžāĻžāĻ¨āĻ•ā§‡ āĻ°āĻŋāĻĢā§āĻ°ā§‡āĻļ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§‹āĻ—ā§€ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ•ā§‡āĻ¨ āĻāĻŸāĻž āĻ¸āĻŦ? āĻŸā§āĻ°āĻžāĻ¨āĻœāĻŋāĻ¸ā§āĻŸāĻ° āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻ°ā§āĻŦāĻ¨āĻŋāĻŽā§āĻ¨ āĻ†āĻ•āĻžāĻ°ā§‡ āĻĒā§ŒāĻāĻ›āĻžāĻ¯āĻŧ, āĻŽā§āĻ°ā§‡āĻ° āĻ†āĻ‡āĻ¨ āĻ†āĻ˛ā§‹āĻ° āĻ—āĻ¤āĻŋāĻ° āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ‡āĻœāĻ¨ā§āĻ¯ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ¯āĻŧ āĻŦā§ƒāĻĻā§āĻ§āĻŋ āĻĒāĻ°āĻŋāĻ˛āĻ•ā§āĻˇāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ†āĻ°āĻ“ āĻŸā§āĻ°āĻžāĻ¨āĻœāĻŋāĻ¸ā§āĻŸāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻāĻ•āĻ‡ āĻ¸āĻŽāĻ¯āĻŧā§‡, āĻĄā§‡āĻŸāĻžāĻ° āĻĒāĻ°āĻŋāĻŽāĻžāĻŖ āĻŦāĻžāĻĄāĻŧāĻ›ā§‡, āĻāĻŦāĻ‚ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ°āĻž āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻ—ā§āĻ˛āĻŋ āĻĨā§‡āĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ¤ā§āĻ•ā§āĻˇāĻŖāĻŋāĻ• āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ†āĻļāĻž āĻ•āĻ°ā§‡ā§ˇ āĻāĻŽāĻ¨ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ¤ā§‡, "āĻ¸ā§āĻŦāĻžāĻ­āĻžāĻŦāĻŋāĻ•" āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚, āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ°ā§€ āĻĨā§āĻ°ā§‡āĻĄ āĻĨāĻžāĻ•ā§‡, āĻ¤āĻ–āĻ¨ āĻ†āĻ° āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻ°āĻ•āĻŽ āĻŦāĻž āĻāĻ•āĻ¯ā§‹āĻ—ā§‡ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ° āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ¤āĻĻā§āĻĒāĻ°āĻŋ, āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸ā§āĻ¤āĻ°ā§‡ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨: āĻĨā§āĻ°ā§‡āĻĄā§‡āĻ° āĻ¸ā§āĻ¤āĻ°ā§‡, āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§āĻ¤āĻ°ā§‡, āĻ¨ā§‡āĻŸāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•ā§‡āĻ° āĻŽā§‡āĻļāĻŋāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§āĻ¤āĻ°ā§‡ (āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻ•āĻ°āĻž āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ)āĨ¤ āĻĻā§āĻ°ā§āĻ¤ āĻāĻŦāĻ‚ āĻĻāĻ•ā§āĻˇāĻ¤āĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ .NET-āĻāĻ° āĻ‰āĻšā§āĻš-āĻŽāĻžāĻ¨ā§‡āĻ°, āĻ¸āĻŽāĻ¯āĻŧ-āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻŋāĻ¤ āĻĒā§āĻ°āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤

āĻ•āĻžāĻœā§‡āĻ°

āĻāĻĄāĻœāĻžāĻ° āĻĄāĻŋāĻœāĻ•āĻ¸ā§āĻŸā§āĻ°āĻž 1965 āĻ¸āĻžāĻ˛ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ•ā§‡ āĻ¤āĻžāĻ° āĻ›āĻžāĻ¤ā§āĻ°āĻĻā§‡āĻ° āĻ•āĻžāĻ›ā§‡ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻ¤ā§āĻ˛ā§‡ āĻ§āĻ°ā§‡āĻ¨āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻˇā§āĻ āĻŋāĻ¤ āĻ¸ā§‚āĻ¤ā§āĻ°āĻŸāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒāĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ (āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻĒāĻžāĻāĻš) āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻāĻŦāĻ‚ āĻāĻ•āĻ‡ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻ• āĻ•āĻžāĻāĻŸāĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻ¤āĻžāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ—ā§‹āĻ˛ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻŦāĻ¸ā§‡, āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ•āĻžāĻāĻŸāĻžāĨ¤ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ°āĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻĒā§āĻ˛ā§‡āĻŸ āĻĨā§‡āĻ•ā§‡ āĻ…āĻĢā§āĻ°āĻ¨ā§āĻ¤ āĻ–āĻžāĻŦāĻžāĻ° āĻ–ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ­āĻžāĻŦāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻŦāĻž āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨āĨ¤ āĻāĻ•āĻœāĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻ–ā§‡āĻ¤ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĻā§āĻŸāĻŋ āĻ•āĻžāĻāĻŸāĻž āĻ¨āĻŋāĻ¤ā§‡ āĻšāĻŦā§‡ (āĻļā§‡āĻˇāĻŸāĻŋ āĻĒā§āĻ°āĻĨāĻŽāĻŸāĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻāĻŸāĻž āĻ­āĻžāĻ— āĻ•āĻ°ā§‡ āĻ¨ā§‡āĻ¯āĻŧ)āĨ¤ āĻ•āĻžāĻāĻŸāĻž āĻ¤ā§‹āĻ˛āĻž āĻāĻŦāĻ‚ āĻ•āĻžāĻāĻŸāĻž āĻ¨āĻžāĻŽāĻžāĻ¨ā§‹ āĻĻā§āĻŸāĻŋ āĻĒā§ƒāĻĨāĻ• āĻ•āĻžāĻœāĨ¤ āĻ¸āĻŦ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻ¨ā§€āĻ°āĻŦāĨ¤ āĻ•āĻžāĻœāĻŸāĻŋ āĻšāĻ˛ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ…ā§āĻ¯āĻžāĻ˛āĻ—āĻ°āĻŋāĻĻāĻŽ āĻ–ā§āĻāĻœā§‡ āĻŦā§‡āĻ° āĻ•āĻ°āĻž āĻ¯āĻžāĻ¤ā§‡ āĻ¤āĻžāĻ°āĻž āĻ¸āĻŦāĻžāĻ‡ āĻ­āĻžāĻŦāĻŦā§‡ āĻāĻŦāĻ‚ 54 āĻŦāĻ›āĻ° āĻĒāĻ°ā§‡āĻ“ āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻŦā§‡āĨ¤

āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻ†āĻ¸ā§āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ— āĻ•āĻ°āĻž āĻ¸ā§āĻĨāĻžāĻ¨ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŋāĨ¤ āĻ•āĻžāĻāĻŸāĻžāĻ—ā§āĻ˛āĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡āĻ° āĻ‰āĻĒāĻ° āĻĒāĻĄāĻŧā§‡ āĻĨāĻžāĻ•ā§‡ āĻāĻŦāĻ‚ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ°āĻž āĻ¯āĻ–āĻ¨ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻ–āĻ¨ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ†āĻ›ā§‡, āĻ āĻŋāĻ• āĻ•āĻ–āĻ¨ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡? āĻ•āĻžāĻāĻŸāĻž āĻ¨āĻž āĻĨāĻžāĻ•āĻ˛ā§‡ āĻ•āĻŋ āĻšāĻŦā§‡? āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻ¤āĻŦā§‡ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻĻā§‡āĻ° āĻ•āĻĨāĻž āĻļā§āĻ°ā§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ•āĨ¤

āĻĨā§āĻ°ā§‡āĻĄ āĻļā§āĻ°ā§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĨā§āĻ°ā§‡āĻĄ āĻĒā§āĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ Task.Run āĻĒāĻĻā§āĻ§āĻ¤āĻŋ:

var cancelTokenSource = new CancellationTokenSource();
Action<int> create = (i) => RunPhilosopher(i, cancelTokenSource.Token);
for (int i = 0; i < philosophersAmount; i++) 
{
    int icopy = i;
    // ПоĐŧĐĩŅŅ‚иŅ‚ŅŒ СадаŅ‡Ņƒ в ĐžŅ‡ĐĩŅ€ĐĩĐ´ŅŒ ĐŋŅƒĐģĐ° ĐŋĐžŅ‚ĐžĐēОв. МĐĩŅ‚Од RunDeadlock ĐŊĐĩ СаĐŋŅƒŅĐēĐ°ĐĩŅ‚ŅŒŅŅ 
    // ŅŅ€Đ°ĐˇŅƒ, Đ° ĐļĐ´ĐĩŅ‚ ŅĐ˛ĐžĐĩĐŗĐž ĐŋĐžŅ‚ĐžĐēĐ°. АŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐŊŅ‹Đš СаĐŋŅƒŅĐē.
    philosophers[i] = Task.Run(() => create(icopy), cancelTokenSource.Token);
}

āĻĨā§āĻ°ā§‡āĻĄ āĻĒā§āĻ˛āĻŸāĻŋ āĻĨā§āĻ°ā§‡āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻāĻŦāĻ‚ āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§āĻŸāĻŋāĻŽāĻžāĻ‡āĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻ‡ āĻĒā§āĻ˛ā§‡ āĻŸāĻžāĻ¸ā§āĻ• āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ°āĻŋ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ CLR āĻāĻ‡ āĻ•āĻžāĻœā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ āĻĨā§āĻ°ā§‡āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡ āĻŦāĻž āĻ¸āĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻ¸āĻŽāĻ¸ā§āĻ¤ AppDomains āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ˛. āĻāĻ‡ āĻĒā§āĻ˛ āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤, āĻ•āĻžāĻ°āĻŖ. āĻĨā§āĻ°ā§‡āĻĄ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž, āĻŽā§āĻ›ā§‡ āĻĢā§‡āĻ˛āĻž, āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻ°āĻŋ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻŽāĻžāĻĨāĻž āĻ˜āĻžāĻŽāĻžāĻ¨ā§‹āĻ° āĻĻāĻ°āĻ•āĻžāĻ° āĻ¨ā§‡āĻ‡ā§ˇ āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ˛ āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ¸āĻŽā§āĻ­āĻŦ, āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻŸāĻŋ āĻ¸āĻ°āĻžāĻ¸āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ Thread, āĻ¯āĻ–āĻ¨ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻĨā§āĻ°ā§‡āĻĄā§‡āĻ° āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡, āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻĻā§€āĻ°ā§āĻ˜ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ āĻ†āĻ›ā§‡, āĻāĻ•āĻŸāĻŋ āĻĢā§‹āĻ°āĻ—ā§āĻ°āĻžāĻ‰āĻ¨ā§āĻĄ āĻĨā§āĻ°ā§‡āĻĄ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĻ° āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻāĻŸāĻŋ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻ°āĨ¤

āĻ…āĻ¨ā§āĻ¯ āĻ•āĻĨāĻžāĻ¯āĻŧ, System.Threading.Tasks.Task āĻ•ā§āĻ˛āĻžāĻ¸ āĻāĻ•āĻ‡ Thread, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŦ āĻ§āĻ°āĻŖā§‡āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ° āĻ¸āĻžāĻĨā§‡: āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ•āĻžāĻœā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ•ā§‡āĻ° āĻĒāĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻŸāĻžāĻ¸ā§āĻ• āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž, āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻĨā§‡āĻ•ā§‡ āĻĢāĻŋāĻ°āĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž, āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻŽāĻ¤ āĻŦāĻžāĻ§āĻž āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻāĻŦāĻ‚ āĻ†āĻ°āĻ“ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§āĨ¤ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•/āĻ“āĻ¯āĻŧā§‡āĻŸ āĻ•āĻ¨āĻ¸ā§āĻŸā§āĻ°āĻžāĻ•āĻļāĻ¨ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ (āĻŸāĻžāĻ¸ā§āĻ•-āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• āĻ…ā§āĻ¯āĻžāĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ¸ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨, āĻ†āĻ‡āĻ“ āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŋāĻ¨āĻŸā§āĻ¯āĻžāĻ•āĻŸāĻŋāĻ• āĻšāĻŋāĻ¨āĻŋ)āĨ¤ āĻ†āĻŽāĻ°āĻž āĻĒāĻ°ā§‡ āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ•āĻĨāĻž āĻšāĻŦā§‡.

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)
    );
}

āĻāĻ‡ āĻ•ā§‹āĻĄ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ āĻŦāĻŋāĻˇāĻ¯āĻŧ āĻšāĻ˛ āĻ¯ā§‡ āĻšāĻžāĻ°āĻŸāĻŋ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĻā§āĻ‡āĻœāĻ¨ āĻ¤āĻžāĻĻā§‡āĻ° āĻŦāĻžāĻŽ āĻ•āĻžāĻāĻŸāĻž āĻ¨āĻŋāĻšā§‡ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻ­ā§āĻ˛ā§‡ āĻ¯āĻžāĻ¨āĨ¤ āĻāĻŦāĻ‚ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻšā§āĻ›ā§‡ āĻ¯ā§‡ āĻ¤āĻžāĻ°āĻž āĻ†āĻ°āĻ“ āĻ–āĻžāĻŦāĻžāĻ° āĻ–āĻžāĻ¯āĻŧ, āĻ…āĻ¨ā§āĻ¯āĻ°āĻž āĻ•ā§āĻˇā§āĻ§āĻžāĻ°ā§āĻ¤ āĻšāĻ¤ā§‡ āĻļā§āĻ°ā§ āĻ•āĻ°ā§‡, āĻ¯āĻĻāĻŋāĻ“ āĻĨā§āĻ°ā§‡āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻ‡ āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¤āĻžāĻ°āĻž āĻĒā§āĻ°ā§‹āĻĒā§āĻ°āĻŋ āĻ•ā§āĻˇā§āĻ§āĻžāĻ°ā§āĻ¤ āĻ¨āĻ¯āĻŧ, āĻ•āĻžāĻ°āĻŖāĨ¤ āĻ–āĻžāĻ°āĻžāĻĒ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ°āĻž āĻ•āĻ–āĻ¨āĻ“ āĻ•āĻ–āĻ¨āĻ“ āĻ¤āĻžāĻĻā§‡āĻ° āĻ•āĻžāĻāĻŸāĻž āĻĒāĻŋāĻ›āĻ¨ā§‡ āĻ°āĻžāĻ–ā§‡āĨ¤ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻšā§āĻ›ā§‡ āĻ­āĻžāĻ˛ā§‹ āĻŽāĻžāĻ¨ā§āĻˇ āĻ–āĻžāĻ°āĻžāĻĒā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻĒā§āĻ°āĻžāĻ¯āĻŧ ā§Ģ āĻ—ā§āĻŖ āĻ•āĻŽ āĻ–āĻžāĻ¯āĻŧāĨ¤ āĻ¸ā§āĻ¤āĻ°āĻžāĻ‚ āĻ•ā§‹āĻĄā§‡ āĻāĻ•āĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻšā§āĻ°āĻžāĻ¸ā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧāĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻāĻŸāĻŋāĻ“ āĻ˛āĻ•ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻ°āĻ˛ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻ¸āĻŽā§āĻ­āĻŦ āĻ¯āĻ–āĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻŦāĻžāĻŽ āĻ•āĻžāĻāĻŸāĻž āĻ¨ā§‡āĻ¯āĻŧ, āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻĄāĻžāĻ¨ āĻ•ā§‡āĻ‰ āĻ¨ā§‡āĻ‡, āĻ¤āĻžāĻ°āĻž āĻŦāĻžāĻŽāĻĻāĻŋāĻ•ā§‡ āĻ°āĻžāĻ–ā§‡āĻ¨, āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡āĻ¨, āĻ†āĻŦāĻžāĻ° āĻŦāĻžāĻŽāĻŸāĻŋ āĻ¨ā§‡āĻ¨ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻāĻ‡ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ“ āĻ…āĻ¨āĻžāĻšāĻžāĻ°, āĻ…āĻ¨ā§‡āĻ•āĻŸāĻž āĻ…āĻšāĻ˛āĻžāĻŦāĻ¸ā§āĻĨāĻžāĻ° āĻŽāĻ¤ā§‹āĨ¤ āĻ†āĻŽāĻŋ āĻāĻŸāĻŋ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡. āĻ¨ā§€āĻšā§‡ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ›āĻŦāĻŋ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻĻā§āĻŸāĻŋ āĻ–āĻžāĻ°āĻžāĻĒ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻ‰āĻ­āĻ¯āĻŧāĻ‡ āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻš āĻ¨āĻŋāĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻĻā§āĻŸāĻŋ āĻ­āĻžāĻ˛ āĻ•ā§āĻˇā§āĻ§āĻžāĻ°ā§āĻ¤āĨ¤

āĻ­āĻžāĻ˛-āĻĢā§‡āĻĄ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻŦāĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ• .NET āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚

āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯ā§‡ āĻĨā§āĻ°ā§‡āĻĄāĻ—ā§āĻ˛āĻŋ āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡ āĻœā§‡āĻ—ā§‡ āĻ“āĻ ā§‡ āĻāĻŦāĻ‚ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨ āĻĒā§‡āĻ¤ā§‡ āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§‡āĨ¤ āĻšāĻžāĻ°āĻŸāĻŋ āĻ•ā§‹āĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĻā§āĻŸāĻŋ āĻ•āĻŋāĻ›ā§āĻ‡ āĻ•āĻ°ā§‡ āĻ¨āĻž (āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ¸āĻŦā§āĻœ āĻ—ā§āĻ°āĻžāĻĢ)āĨ¤

āĻāĻ•āĻœāĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•ā§‡āĻ° āĻŽā§ƒāĻ¤ā§āĻ¯ā§

āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻ†āĻ°ā§‡āĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¯āĻž āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻĻā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻŽāĻšāĻŋāĻŽāĻžāĻ¨ā§āĻŦāĻŋāĻ¤ āĻ¨ā§ˆāĻļāĻ­ā§‹āĻœā§‡ āĻŦāĻžāĻ§āĻž āĻĻāĻŋāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¤āĻž āĻš'āĻ˛ āĻ¯āĻĻāĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻœāĻ¨ āĻšāĻ āĻžā§Ž āĻ¤āĻžāĻ° āĻšāĻžāĻ¤ā§‡ āĻ•āĻžāĻāĻŸāĻž āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻŽāĻžāĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ (āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻž āĻ¤āĻžāĻ•ā§‡ āĻāĻ­āĻžāĻŦā§‡ āĻ•āĻŦāĻ° āĻĻā§‡āĻŦā§‡)āĨ¤ āĻ¤āĻžāĻ°āĻĒāĻ° āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻļā§€āĻĻā§‡āĻ° āĻ°āĻžāĻ¤ā§‡āĻ° āĻ–āĻžāĻŦāĻžāĻ° āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻšāĻ˛ā§‡ āĻ¯āĻžāĻŦā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡ āĻ¨āĻŋāĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ•ā§‹āĻĄ āĻ¨āĻŋāĻ¯āĻŧā§‡ āĻ†āĻ¸āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻŸāĻŋ āĻĢā§‡āĻ˛ā§‡ āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻšāĻ¯āĻŧ NullReferenceException āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻš āĻĒāĻ°ā§‡. āĻāĻŦāĻ‚, āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻŦā§āĻ¯āĻ¤āĻŋāĻ•ā§āĻ°āĻŽāĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ āĻ•āĻ˛āĻŋāĻ‚ āĻ•ā§‹āĻĄāĻŸāĻŋ āĻ•ā§‡āĻŦāĻ˛ āĻāĻŸāĻŋ āĻ§āĻ°āĻŦā§‡ āĻ¨āĻž (āĻāĻ° āĻœāĻ¨ā§āĻ¯ AppDomain.CurrentDomain.UnhandledException āĻāĻŦāĻ‚ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ.). āĻ…āĻ¤āĻāĻŦ, āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻĻā§‡āĻ° āĻĨā§āĻ°ā§‡āĻĄā§‡āĻ° āĻ¨āĻŋāĻœā§‡āĻ°āĻžāĻ‡ āĻāĻŦāĻ‚ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻ¸āĻŽāĻžāĻĒā§āĻ¤āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨āĨ¤

āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ°

āĻ āĻŋāĻ• āĻ†āĻ›ā§‡, āĻ†āĻŽāĻ°āĻž āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻāĻ‡ āĻ…āĻšāĻ˛āĻžāĻŦāĻ¸ā§āĻĨāĻž, āĻ…āĻ¨āĻžāĻšāĻžāĻ° āĻāĻŦāĻ‚ āĻŽā§ƒāĻ¤ā§āĻ¯ā§āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻŦ? āĻ†āĻŽāĻ°āĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻœāĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ•ā§‡ āĻ•āĻžāĻāĻŸāĻžāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻĒā§ŒāĻāĻ›āĻžāĻ¨ā§‹āĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻŦ, āĻāĻ‡ āĻœāĻžāĻ¯āĻŧāĻ—āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĨā§āĻ°ā§‡āĻĄāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ°āĻ¸ā§āĻĒāĻ°āĻŋāĻ• āĻŦāĻ°ā§āĻœāĻ¨ āĻ¯ā§‹āĻ— āĻ•āĻ°ā§āĻ¨āĨ¤ āĻāĻŸāĻž āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡? āĻ§āĻ°ā§āĻ¨, āĻāĻ•āĻœāĻ¨ āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ° āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻĻā§‡āĻ° āĻĒāĻžāĻļā§‡ āĻĻāĻžāĻāĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻ†āĻ›ā§‡, āĻ¯āĻŋāĻ¨āĻŋ āĻāĻ•āĻœāĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ•ā§‡ āĻ•āĻžāĻāĻŸāĻž āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¨āĨ¤ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ‡ āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ° āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻŦ āĻāĻŦāĻ‚ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ°āĻž āĻ¤āĻžāĻ•ā§‡ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻŦā§‡āĻ¨, āĻĒā§āĻ°āĻļā§āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧāĨ¤

āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻšāĻœ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻšāĻ˛ āĻ¯āĻ–āĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ°āĻž āĻ•ā§āĻ°āĻŽāĻžāĻ—āĻ¤ āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ°āĻ•ā§‡ āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻš āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻŦā§‡āĨ¤ āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹. āĻāĻ–āĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ°āĻž āĻ•āĻžāĻ›āĻžāĻ•āĻžāĻ›āĻŋ āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻšā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦā§‡ āĻ¨āĻž, āĻ¤āĻŦā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦā§‡ āĻŦāĻž āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ°āĻ•ā§‡ āĻœāĻŋāĻœā§āĻžāĻžāĻ¸āĻž āĻ•āĻ°āĻŦā§‡āĨ¤ āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻ†āĻŽāĻ°āĻž āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ‡āĻ‰āĻœāĻžāĻ° āĻ¸ā§āĻĒā§‡āĻ¸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻāĻ¤ā§‡ āĻ†āĻŽāĻ°āĻž āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻĨā§‡āĻ•ā§‡ āĻ•ā§‹āĻ¨ā§‹ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ•āĻ˛ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻžāĻĒā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻ¨āĻž (āĻ¨āĻŋāĻšā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡)āĨ¤

āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¸ā§āĻĨāĻžāĻ¨ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨

āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ• āĻ•āĻžāĻāĻŸāĻž āĻāĻŦāĻ‚ āĻĻā§āĻ‡ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¯ā§‡āĻ­āĻžāĻŦā§‡ āĻ•āĻ°āĻ¤āĻžāĻŽ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻ‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻŦ, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻšāĻ•ā§āĻ°ā§‡ āĻ˜ā§āĻ°āĻŦ āĻāĻŦāĻ‚ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻŦāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ–āĻ¨ āĻāĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻšāĻŦā§‡ āĻāĻŦāĻ‚, āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ›āĻŋāĻ˛, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻāĻŸāĻž, āĻ…āĻ°ā§āĻĨāĻžā§Ž āĻāĻŸāĻž āĻŦāĻ˛āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯ā§‡ āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ°ā§‡āĻ° āĻ•āĻžāĻ› āĻĨā§‡āĻ•ā§‡ āĻāĻ‡ "āĻ¸ā§‹āĻ¨āĻžāĻ° āĻ•āĻžāĻāĻŸāĻž" āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻž āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ‡ āĻ–āĻžāĻŦā§‡āĻ¨āĨ¤ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ†āĻŽāĻ°āĻž SpinLock āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋāĨ¤

private static SpinLock spinLock = new SpinLock();  // НаŅˆ "ĐžŅ„иŅ†Đ¸Đ°ĐŊŅ‚"
private void RunSpinLock(int i, CancellationToken token)
{
    while (true)
    {
        // ВзаиĐŧĐŊĐ°Ņ ĐąĐģĐžĐēиŅ€ĐžĐ˛ĐēĐ° Ņ‡ĐĩŅ€ĐĩС busy waiting. ВŅ‹ĐˇŅ‹Đ˛Đ°ĐĩĐŧ Đ´Đž try, Ņ‡Ņ‚ОйŅ‹
        // вŅ‹ĐąŅ€Đ°ŅĐ¸Ņ‚ŅŒ иŅĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ в ŅĐģŅƒŅ‡Đ°Đĩ ĐžŅˆĐ¸ĐąĐēи в ŅĐ°ĐŧĐžĐŧ SpinLock.
        bool hasLock = false;
        spinLock.Enter(ref hasLock);
        try
        {
            // ЗдĐĩŅŅŒ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Ņ‚ĐžĐģŅŒĐēĐž ОдиĐŊ ĐŋĐžŅ‚ĐžĐē (mutual exclusion).
            forks[Left(i)] = i + 1;  // БĐĩŅ€ĐĩĐŧ виĐģĐēŅƒ ŅŅ€Đ°ĐˇŅƒ, ĐąĐĩС ĐžĐļидаĐŊиŅ.
            forks[Right(i)] = i + 1;
            eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
            forks[Left(i)] = 0;
            forks[Right(i)] = 0;
        }
        finally
        {
            if(hasLock) spinLock.Exit();  // ИСйĐĩĐŗĐ°ĐĩĐŧ ĐŋŅ€ĐžĐąĐģĐĩĐŧŅ‹ ŅĐž ŅĐŧĐĩŅ€Ņ‚ŅŒŅŽ Ņ„иĐģĐžŅĐžŅ„Đ°.
        }

        Think(i);

        if (token.IsCancellationRequested)
            break;
    }
}

SpinLock āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ˛āĻ•āĻžāĻ°, āĻ¸āĻ™ā§āĻ—ā§‡, āĻŽā§‹āĻŸāĻžāĻŽā§āĻŸāĻŋāĻ­āĻžāĻŦā§‡ āĻŦāĻ˛āĻ¤ā§‡ āĻ—ā§‡āĻ˛ā§‡, āĻāĻ•āĻ‡ while(true) { if (!lock) break; }, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ° āĻšā§‡āĻ¯āĻŧā§‡āĻ“ āĻŦā§‡āĻļāĻŋ "āĻœāĻžāĻĻā§" āĻ¸āĻš SpinWait (āĻ¯āĻž āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŦā§āĻ¯āĻŦāĻšā§ƒāĻ¤ āĻšāĻ¯āĻŧ)āĨ¤ āĻāĻ–āĻ¨ āĻ¤āĻŋāĻ¨āĻŋ āĻœāĻžāĻ¨ā§‡āĻ¨ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻžāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻ—āĻŖāĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡, āĻ¤āĻžāĻĻā§‡āĻ° āĻāĻ•āĻŸā§ āĻ˜ā§āĻŽāĻžāĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ†āĻ°āĻ“ āĻ…āĻ¨ā§‡āĻ• āĻ•āĻŋāĻ›ā§āĨ¤ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ­āĻžāĻŦā§‡, āĻ…āĻĒā§āĻŸāĻŋāĻŽāĻžāĻ‡āĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŦāĻ•āĻŋāĻ›ā§ āĻ¸āĻŽā§āĻ­āĻŦ āĻ•āĻ°ā§‡āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…āĻŦāĻļā§āĻ¯āĻ‡ āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻāĻ–āĻ¨āĻ“ āĻāĻ•āĻ‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻšāĻ•ā§āĻ° āĻ¯āĻž āĻĒā§āĻ°āĻ¸ā§‡āĻ¸āĻ°ā§‡āĻ° āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ–āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻŦāĻžāĻšāĻ•ā§‡ āĻ§āĻ°ā§‡ āĻ°āĻžāĻ–ā§‡, āĻ¯āĻž āĻ•ā§āĻˇā§āĻ§āĻžāĻ°ā§āĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¯āĻĻāĻŋ āĻāĻ•āĻœāĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻ…āĻ¨ā§āĻ¯āĻĻā§‡āĻ° āĻšā§‡āĻ¯āĻŧā§‡ āĻŦā§‡āĻļāĻŋ āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻĒāĻžāĻ¯āĻŧ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸ā§‹āĻ¨āĻžāĻ° āĻ•āĻžāĻāĻŸāĻž āĻ¨āĻž āĻĨāĻžāĻ•ā§‡ (āĻ…āĻ—ā§āĻ°āĻžāĻ§āĻŋāĻ•āĻžāĻ° āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž) . āĻ…āĻ¤āĻāĻŦ, āĻ†āĻŽāĻ°āĻž āĻāĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻž āĻŽā§‡āĻŽāĻ°āĻŋāĻ¤ā§‡ āĻ–ā§āĻŦ āĻ…āĻ˛ā§āĻĒ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ•ā§‹āĻ¨ā§‹ āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧ āĻĒāĻ•ā§āĻˇā§‡āĻ° āĻ•āĻ˛, āĻ¨ā§‡āĻ¸ā§āĻŸā§‡āĻĄ āĻ˛āĻ• āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻšāĻŽāĻ• āĻ›āĻžāĻĄāĻŧāĻžāĻ‡āĨ¤

āĻ­āĻžāĻ˛-āĻĢā§‡āĻĄ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻŦāĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻŽā§‚āĻ˛āĻ• .NET āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚

āĻœāĻ¨ā§āĻ¯ āĻ…āĻ™ā§āĻ•āĻ¨ SpinLock. āĻ¸ā§āĻ°ā§‹āĻ¤āĻ—ā§āĻ˛āĻŋ āĻ•ā§āĻ°āĻŽāĻžāĻ—āĻ¤ āĻ¸ā§‹āĻ¨āĻžāĻ° āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻšā§‡āĻ° āĻœāĻ¨ā§āĻ¯ "āĻ˛āĻĄāĻŧāĻžāĻ‡" āĻ•āĻ°āĻ›ā§‡āĨ¤ āĻŦā§āĻ¯āĻ°ā§āĻĨāĻ¤āĻž āĻ†āĻ›ā§‡ - āĻšāĻŋāĻ¤ā§āĻ°ā§‡, āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻŋāĻ¤ āĻāĻ˛āĻžāĻ•āĻž. āĻ•ā§‹āĻ°āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖāĻ°ā§‚āĻĒā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž: āĻāĻ‡ āĻšāĻžāĻ°āĻŸāĻŋ āĻĨā§āĻ°ā§‡āĻĄ āĻĻā§āĻŦāĻžāĻ°āĻž āĻŽāĻžāĻ¤ā§āĻ° 2/3āĨ¤

āĻāĻ–āĻžāĻ¨ā§‡ āĻ†āĻ°ā§‡āĻ•āĻŸāĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻšāĻŦā§‡ Interlocked.CompareExchange āĻ‰āĻĒāĻ°ā§‡āĻ° āĻ•ā§‹āĻĄā§‡ āĻĻā§‡āĻ–āĻžāĻ¨ā§‹ āĻāĻ•āĻ‡ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻĨā§‡ (āĻ•ā§āĻˇā§āĻ§āĻžāĻ°ā§āĻ¤ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻĻā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡), āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŸāĻŋ, āĻ¯ā§‡āĻŽāĻ¨āĻŸāĻŋ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻŦāĻ˛āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¤āĻžāĻ¤ā§āĻ¤ā§āĻŦāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ‰āĻĒāĻ° Interlocked āĻāĻŸāĻž āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ†āĻ›ā§‡ CompareExchange, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻĒāĻžāĻ°āĻŽāĻžāĻŖāĻŦāĻŋāĻ• āĻĒāĻĄāĻŧāĻž āĻāĻŦāĻ‚ āĻ˛ā§‡āĻ–āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĨ¤ āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡, āĻ¯āĻĻāĻŋ āĻ…āĻ¨ā§āĻ¯ āĻĨā§āĻ°ā§‡āĻĄā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĨāĻžāĻ•ā§‡ (āĻĒāĻĄāĻŧā§āĻ¨ 1, āĻĒāĻĄāĻŧāĻž 2, āĻ˛āĻŋāĻ–ā§āĻ¨ 2, āĻ˛āĻŋāĻ–ā§āĻ¨ 1 āĻ–āĻžāĻ°āĻžāĻĒ), āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• āĻŽāĻžāĻ¨ (āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻ˛āĻ•āĻĄ āĻāĻ¨āĻŋāĻĨāĻŋāĻ‚ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨) āĻœāĻŸāĻŋāĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻŽā§‹āĻĄ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨

āĻ˛ā§āĻĒā§‡ āĻ¸āĻŽā§āĻĒāĻĻā§‡āĻ° āĻ…āĻĒāĻšāĻ¯āĻŧ āĻāĻĄāĻŧāĻžāĻ¤ā§‡, āĻ†āĻ¸ā§āĻ¨ āĻĻā§‡āĻ–āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĨā§āĻ°ā§‡āĻĄ āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŋāĨ¤ āĻ…āĻ¨ā§āĻ¯ āĻ•āĻĨāĻžāĻ¯āĻŧ, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻ…āĻŦā§āĻ¯āĻžāĻšāĻ¤ āĻ°ā§‡āĻ–ā§‡, āĻ†āĻ¸ā§āĻ¨ āĻĻā§‡āĻ–āĻŋ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ° āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ•ā§‡ āĻ˜ā§āĻŽāĻŋāĻ¯āĻŧā§‡ āĻ°āĻžāĻ–ā§‡ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ˛ā§‡āĻ‡ āĻ¤āĻžāĻ•ā§‡ āĻœāĻžāĻ—āĻŋāĻ¯āĻŧā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤ āĻĒā§āĻ°āĻĨāĻŽā§‡, āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻŋāĻ‚ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻŽā§‹āĻĄā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ āĻ¤āĻž āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ•āĨ¤ āĻ¸ā§‡āĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĒā§āĻ°āĻžāĻ¯āĻŧāĻļāĻ‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻ¸ā§āĻĨāĻžāĻ¨ā§‡āĻ° āĻ¤ā§āĻ˛āĻ¨āĻžāĻ¯āĻŧ āĻ§ā§€āĻ° āĻšāĻ¯āĻŧāĨ¤ āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŦāĻžāĻ° āĻ§ā§€āĻ°, āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ AutoResetEvent āĻ¸āĻŽā§āĻ­āĻŦāĻ¤ 53 āĻ—ā§āĻŖ āĻ§ā§€āĻ° SpinLock [āĻ°āĻŋāĻ–āĻŸāĻžāĻ°]āĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻœā§āĻĄāĻŧā§‡ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ‡āĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻŋāĻ¤ āĻŦāĻž āĻ¨āĻžāĨ¤

āĻ…āĻ°ā§āĻ§āĻļāĻ¤āĻžāĻŦā§āĻĻā§€ āĻ†āĻ—ā§‡ āĻĄāĻŋāĻœāĻ•āĻ¸ā§āĻŸā§āĻ°āĻž āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒā§āĻ°āĻ¸ā§āĻ¤āĻžāĻŦāĻŋāĻ¤ āĻ¸ā§‡āĻŽāĻžāĻĢā§‹āĻ° āĻāĻ–āĻžāĻ¨ā§‡ āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖāĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŽāĻžāĻĢā§‹āĻ° āĻšāĻ˛, āĻ¸āĻšāĻœāĻ­āĻžāĻŦā§‡ āĻŦāĻ˛āĻ¤ā§‡ āĻ—ā§‡āĻ˛ā§‡, āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽ āĻĻā§āĻŦāĻžāĻ°āĻž āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻŋāĻ¤ āĻāĻ•āĻŸāĻŋ āĻ§āĻ¨āĻžāĻ¤ā§āĻŽāĻ• āĻĒā§‚āĻ°ā§āĻŖāĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻāĻŦāĻ‚ āĻāĻŸāĻŋāĻ¤ā§‡ āĻĻā§āĻŸāĻŋ āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ˛āĻžāĻĒ, āĻŦā§ƒāĻĻā§āĻ§āĻŋ āĻāĻŦāĻ‚ āĻšā§āĻ°āĻžāĻ¸āĨ¤ āĻ¯āĻĻāĻŋ āĻāĻŸāĻŋ āĻšā§āĻ°āĻžāĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧ, āĻļā§‚āĻ¨ā§āĻ¯, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•āĻ˛āĻŋāĻ‚ āĻĨā§āĻ°ā§‡āĻĄāĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻ–āĻ¨ āĻ¸āĻ‚āĻ–ā§āĻ¯āĻžāĻŸāĻŋ āĻ…āĻ¨ā§āĻ¯ āĻ•āĻŋāĻ›ā§ āĻ¸āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻĨā§āĻ°ā§‡āĻĄ/āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĻā§āĻŦāĻžāĻ°āĻž āĻŦā§ƒāĻĻā§āĻ§āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻ–āĻ¨ āĻĨā§āĻ°ā§‡āĻĄāĻ—ā§āĻ˛āĻŋ āĻāĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒāĻžāĻ¸ āĻ•āĻ°āĻž āĻ¨āĻŽā§āĻŦāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ¸ā§‡āĻŽāĻžāĻĢā§‹āĻ° āĻ†āĻŦāĻžāĻ° āĻšā§āĻ°āĻžāĻ¸ āĻĒāĻžāĻ¯āĻŧāĨ¤ āĻāĻ•āĻŸāĻŋ āĻ¸ā§‡āĻŽāĻžāĻĢā§‹āĻ° āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ§āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻŸā§āĻ°ā§‡āĻ¨ āĻ•āĻ˛ā§āĻĒāĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨. .NET āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻ•āĻžāĻ°ā§āĻ¯āĻ•āĻžāĻ°āĻŋāĻ¤āĻž āĻ¸āĻš āĻŦā§‡āĻļ āĻ•āĻ¯āĻŧā§‡āĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻ…āĻĢāĻžāĻ° āĻ•āĻ°ā§‡: AutoResetEvent, ManualResetEvent, Mutex āĻāĻŦāĻ‚ āĻ†āĻŽāĻŋ āĻ¨āĻŋāĻœā§‡ Semaphore. āĻ†āĻŽāĻ°āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦā§‹ AutoResetEvent, āĻāĻŸāĻŋ āĻāĻ‡ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ¸āĻšāĻœ: āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻĻā§āĻŸāĻŋ āĻŽāĻžāĻ¨ 0 āĻāĻŦāĻ‚ 1 (āĻŽāĻŋāĻĨā§āĻ¯āĻž, āĻ¸āĻ¤ā§āĻ¯)āĨ¤ āĻ¤āĻžāĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋ WaitOne() āĻŽāĻžāĻ¨ 0 āĻšāĻ˛ā§‡ āĻ•āĻ˛āĻŋāĻ‚ āĻĨā§āĻ°ā§‡āĻĄ āĻŦā§āĻ˛āĻ• āĻ•āĻ°ā§‡, āĻāĻŦāĻ‚ āĻ¯āĻĻāĻŋ 1, āĻāĻŸāĻŋāĻ•ā§‡ 0-āĻ āĻ¨āĻžāĻŽāĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻāĻĄāĻŧāĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧāĨ¤ āĻāĻ•āĻŸāĻŋ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ Set() 1-āĻ āĻ‰āĻ¨ā§āĻ¨ā§€āĻ¤ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻœāĻ¨ āĻ“āĻ¯āĻŧā§‡āĻŸāĻžāĻ°āĻ•ā§‡ āĻ¯ā§‡āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ, āĻ¯ā§‡ āĻ†āĻŦāĻžāĻ° 0-āĻ¤ā§‡ āĻ¨āĻžāĻŽāĻŋāĻ¯āĻŧā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ¤āĻžāĻ˛ āĻ°ā§‡āĻ˛ā§‡āĻ° āĻŸāĻžāĻ°ā§āĻ¨āĻ¸ā§āĻŸāĻžāĻ‡āĻ˛ā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĨ¤

āĻ†āĻ¸ā§āĻ¨ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻŸāĻŋ āĻœāĻŸāĻŋāĻ˛ āĻ•āĻ°āĻŋ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ˛āĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŋ, āĻāĻŦāĻ‚ āĻāĻ•āĻŦāĻžāĻ°ā§‡ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¸ā§‡āĻ—ā§āĻ˛ā§‹. āĻāĻ–āĻ¨ āĻāĻ•āĻ¸āĻžāĻĨā§‡ āĻ…āĻ¨ā§‡āĻ• āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¯āĻŧāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ†āĻŽāĻ°āĻž āĻ†āĻŦāĻžāĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻŋ āĻ¸āĻ āĻŋāĻ•āĻ­āĻžāĻŦā§‡, āĻ°ā§‡āĻ¸ (āĻœāĻžāĻ¤āĻŋāĻ° āĻļāĻ°ā§āĻ¤āĻžāĻŦāĻ˛ā§€) āĻāĻĄāĻŧāĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯, āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻŦā§‡āĻŸ āĻ¨āĻŋāĻ¤ā§‡āĨ¤

// ДĐģŅ ĐąĐģĐžĐēиŅ€ĐžĐ˛Đ°ĐŊиŅ ĐžŅ‚Đ´ĐĩĐģŅŒĐŊĐžĐŗĐž Ņ„иĐģĐžŅĐžŅ„Đ°.
// ИĐŊиŅ†Đ¸Đ°ĐģиСиŅ€ŅƒĐĩŅ‚ŅŅ: new AutoResetEvent(true) Đ´ĐģŅ ĐēĐ°ĐļĐ´ĐžĐŗĐž.
private AutoResetEvent[] philosopherEvents;

// ДĐģŅ Đ´ĐžŅŅ‚ŅƒĐŋĐ° Đē виĐģĐēĐ°Đŧ / Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅŅ‚ĐžĐģŅƒ.
private AutoResetEvent tableEvent = new AutoResetEvent(true);

// Đ ĐžĐļĐ´ĐĩĐŊиĐĩ Ņ„иĐģĐžŅĐžŅ„Đ°.
public void Run(int i, CancellationToken token)
{
    while (true)
    {
        TakeForks(i); // ЖдĐĩŅ‚ виĐģĐēи.
        // ОбĐĩĐ´. МоĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ и Đ´ĐžĐģŅŒŅˆĐĩ.
        eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1);
        PutForks(i); // ОŅ‚Đ´Đ°Ņ‚ŅŒ виĐģĐēи и Ņ€Đ°ĐˇĐąĐģĐžĐēиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐžŅĐĩĐ´ĐĩĐš.
        Think(i);
        if (token.IsCancellationRequested) break;
    }
}

// ОĐļидаŅ‚ŅŒ виĐģĐēи в ĐąĐģĐžĐēиŅ€ĐžĐ˛ĐēĐĩ.
void TakeForks(int i)
{
    bool hasForks = false;
    while (!hasForks) // ПоĐŋŅ€ĐžĐąĐžĐ˛Đ°Ņ‚ŅŒ ĐĩŅ‰Đĩ Ņ€Đ°Đˇ (ĐąĐģĐžĐēиŅ€ĐžĐ˛ĐēĐ° ĐŊĐĩ СдĐĩŅŅŒ).
    {
        // ИŅĐēĐģŅŽŅ‡Đ°ŅŽŅ‰Đ¸Đš Đ´ĐžŅŅ‚ŅƒĐŋ Đē ŅŅ‚ĐžĐģŅƒ, ĐąĐĩС ĐŗĐžĐŊĐžĐē Са виĐģĐēĐ°Đŧи.
        tableEvent.WaitOne();
        if (forks[Left(i)] == 0 && forks[Right(i)] == 0)
            forks[Left(i)] = forks[Right(i)] = i + 1;
        hasForks = forks[Left(i)] == i + 1 && forks[Right(i)] == i + 1;
        if (hasForks)
            // ĐĸĐĩĐŋĐĩŅ€ŅŒ Ņ„иĐģĐžŅĐžŅ„ ĐŋĐžĐĩŅŅ‚, вŅ‹ĐšĐ´ĐĩŅ‚ иС Ņ†Đ¸ĐēĐģĐ°. ЕŅĐģи Set 
            // вŅ‹ĐˇĐ˛Đ°ĐŊ дваĐļĐ´Ņ‹, Ņ‚Đž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ true.
            philosopherEvents[i].Set();
        // РаСйĐģĐžĐēиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ОдĐŊĐžĐŗĐž ĐžĐļидаŅŽŅ‰ĐĩĐŗĐž. ПоŅĐģĐĩ ĐŊĐĩĐŗĐž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ tableEvent в false.
        tableEvent.Set(); 
        // ЕŅĐģи иĐŧĐĩĐĩŅ‚ true, ĐŊĐĩ ĐąĐģĐžĐēиŅ€ŅƒĐĩŅ‚ŅŅ, Đ° ĐĩŅĐģи false, Ņ‚Đž ĐąŅƒĐ´ĐĩŅ‚ ĐļĐ´Đ°Ņ‚ŅŒ Set ĐžŅ‚ ŅĐžŅĐĩĐ´Đ°.
        philosopherEvents[i].WaitOne();
    }
}

// ОŅ‚Đ´Đ°Ņ‚ŅŒ виĐģĐēи и Ņ€Đ°ĐˇĐąĐģĐžĐēиŅ€ĐžĐ˛Đ°Ņ‚ŅŒ ŅĐžŅĐĩĐ´ĐĩĐš.
void PutForks(int i)
{
    tableEvent.WaitOne(); // БĐĩС ĐŗĐžĐŊĐžĐē Са виĐģĐēĐ°Đŧи.
    forks[Left(i)] = 0;
    // ПŅ€ĐžĐąŅƒĐ´Đ¸Ņ‚ŅŒ ĐģĐĩвОĐŗĐž, Đ° ĐŋĐžŅ‚ĐžĐŧ и ĐŋŅ€Đ°Đ˛ĐžĐŗĐž ŅĐžŅĐĩĐ´Đ°, ĐģийО AutoResetEvent в true.
    philosopherEvents[LeftPhilosopher(i)].Set();
    forks[Right(i)] = 0;
    philosopherEvents[RightPhilosopher(i)].Set();
    tableEvent.Set();
}

āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻŋ āĻ˜āĻŸāĻ›ā§‡ āĻ¤āĻž āĻŦā§‹āĻāĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ¯āĻ–āĻ¨ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻš āĻ¨āĻŋāĻ¤ā§‡ āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¨ āĻ¤āĻ–āĻ¨ āĻ˜āĻŸāĻ¨āĻžāĻŸāĻŋ āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§āĻ¨, āĻ¤āĻžāĻ°āĻĒāĻ°ā§‡ āĻ¤āĻžāĻ° āĻ•āĻ°ā§āĻŽāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒ āĻšāĻŦā§‡āĨ¤ āĻ¤āĻŋāĻ¨āĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻĒā§āĻ°āĻŦā§‡āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻ›ā§‡āĻ¨āĨ¤ āĻāĻŸāĻŋ āĻĒā§‡āĻ¯āĻŧā§‡ āĻ¤āĻŋāĻ¨āĻŋ āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻš āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§‡āĻ¨āĨ¤ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡āĻ¨āĻŋ. āĻāĻŸāĻŋ āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĻā§‡āĻ¯āĻŧ (āĻĒāĻžāĻ°āĻ¸ā§āĻĒāĻ°āĻŋāĻ• āĻŦāĻ°ā§āĻœāĻ¨)āĨ¤ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° "āĻŸāĻžāĻ°ā§āĻ¨āĻ¸ā§āĻŸāĻžāĻ‡āĻ˛" āĻĒāĻžāĻ¸ āĻ•āĻ°ā§‡ (AutoResetEvent) (āĻ¤āĻžāĻ°āĻž āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ•āĻ­āĻžāĻŦā§‡ āĻ–ā§‹āĻ˛āĻž)āĨ¤ āĻāĻŸāĻž āĻ†āĻŦāĻžāĻ° āĻšāĻ•ā§āĻ°ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻĒāĻžāĻ¯āĻŧ, āĻ•āĻžāĻ°āĻŖ āĻ¤āĻžāĻ° āĻ•ā§‹āĻ¨ āĻ•āĻžāĻāĻŸāĻž āĻ†āĻ›ā§‡ āĻ¤āĻŋāĻ¨āĻŋ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§‡āĻ¨ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ° "āĻŸāĻžāĻ°ā§āĻ¨āĻ¸ā§āĻŸāĻžāĻ‡āĻ˛" āĻ āĻĨāĻžāĻŽā§‡āĻ¨āĨ¤ āĻĄāĻžāĻ¨ā§‡ āĻŦāĻž āĻŦāĻžāĻŽā§‡ āĻ†āĻ°āĻ“ āĻ•āĻŋāĻ›ā§ āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻžāĻ¨ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻļā§€, āĻ–āĻžāĻ“āĻ¯āĻŧāĻž āĻļā§‡āĻˇ āĻ•āĻ°ā§‡, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ•āĻ•ā§‡ āĻ¤āĻžāĻ˛āĻž āĻ–ā§āĻ˛ā§‡ āĻĻā§‡āĻ¯āĻŧ, "āĻ¤āĻžāĻ° āĻŸāĻžāĻ°ā§āĻ¨āĻ¸ā§āĻŸāĻžāĻ‡āĻ˛ āĻ–ā§āĻ˛āĻ›ā§‡āĨ¤" āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧāĻŦāĻžāĻ° āĻāĻŸāĻŋ āĻĒāĻžāĻ¸ āĻ•āĻ°ā§‡āĻ¨ (āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻāĻŸāĻŋāĻ° āĻĒāĻŋāĻ›āĻ¨ā§‡ āĻŦāĻ¨ā§āĻ§ āĻšāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ¯āĻŧ)āĨ¤ āĻ¤āĻŋāĻ¨āĻŋ āĻ¤ā§ƒāĻ¤ā§€āĻ¯āĻŧāĻŦāĻžāĻ° āĻ•āĻžāĻāĻŸāĻžāĻšāĻžāĻŽāĻš āĻ¨ā§‡āĻ“āĻ¯āĻŧāĻžāĻ° āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°ā§‡āĻ¨āĨ¤ āĻļā§āĻ­āĻ•āĻžāĻŽāĻ¨āĻžāĨ¤ āĻāĻŦāĻ‚ āĻ¸ā§‡ āĻ–āĻžāĻŦāĻžāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤āĻžāĻ° āĻĒāĻžāĻ˛āĻž āĻĒāĻžāĻĄāĻŧāĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻ¯āĻ–āĻ¨ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ•ā§‹āĻĄā§‡ āĻ°ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻĨāĻžāĻ•ā§‡ (āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°ā§āĻŦāĻĻāĻž āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨), āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¤āĻŋāĻŦā§‡āĻļā§€ āĻ­ā§āĻ˛āĻ­āĻžāĻŦā§‡ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻŦāĻž āĻāĻ•āĻ‡ āĻŦāĻ¸ā§āĻ¤ā§ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ AutoResetEvent āĻ¸āĻŦāĻžāĻ° āĻœāĻ¨ā§āĻ¯ (Enumerable.Repeat), āĻ¤āĻžāĻ°āĻĒāĻ° āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻŦāĻŋāĻ•āĻžāĻļāĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻšāĻŦā§‡, āĻ•āĻžāĻ°āĻŖ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻ•ā§‹āĻĄā§‡ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ–ā§āĻāĻœā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻŦā§‡āĻļ āĻ•āĻ āĻŋāĻ¨ āĻ•āĻžāĻœāĨ¤ āĻāĻ‡ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ†āĻ°ā§‡āĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ˛ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋ āĻĻā§‡āĻ¯āĻŧ āĻ¨āĻž āĻ¯ā§‡ āĻ•āĻŋāĻ›ā§ āĻĻāĻžāĻ°ā§āĻļāĻ¨āĻŋāĻ• āĻ•ā§āĻˇā§āĻ§āĻžāĻ°ā§āĻ¤ āĻšāĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤

āĻšāĻžāĻ‡āĻŦā§āĻ°āĻŋāĻĄ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨

āĻ†āĻŽāĻ°āĻž āĻŸāĻžāĻ‡āĻŽāĻŋāĻ‚ āĻāĻ° āĻĻā§āĻŸāĻŋ āĻĒāĻ¨ā§āĻĨāĻž āĻĻā§‡āĻ–ā§‡āĻ›āĻŋ, āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ‡āĻ‰āĻœāĻžāĻ° āĻŽā§‹āĻĄā§‡ āĻĨāĻžāĻ•āĻŋ āĻāĻŦāĻ‚ āĻ˛ā§āĻĒā§‡ āĻĨāĻžāĻ•āĻŋ āĻāĻŦāĻ‚ āĻ¯āĻ–āĻ¨ āĻ†āĻŽāĻ°āĻž āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻĨā§āĻ°ā§‡āĻĄ āĻŦā§āĻ˛āĻ• āĻ•āĻ°āĻŋāĨ¤ āĻĒā§āĻ°āĻĨāĻŽ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻŸāĻŋ āĻ›ā§‹āĻŸ āĻ˛āĻ•āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ­āĻžāĻ˛, āĻĻā§āĻŦāĻŋāĻ¤ā§€āĻ¯āĻŧāĻŸāĻŋ āĻĻā§€āĻ°ā§āĻ˜āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯āĨ¤ āĻāĻ•āĻŸāĻŋ āĻ˛ā§āĻĒā§‡ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻĨāĻŽā§‡ āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤āĻ­āĻžāĻŦā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨, āĻāĻŦāĻ‚ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻĻā§€āĻ°ā§āĻ˜ āĻšāĻ˛ā§‡ āĻĨā§āĻ°ā§‡āĻĄāĻŸāĻŋ āĻŦā§āĻ˛āĻ• āĻ•āĻ°ā§āĻ¨āĨ¤ āĻāĻ‡ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ¤āĻĨāĻžāĻ•āĻĨāĻŋāĻ¤ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻšāĻ¯āĻŧ. āĻšāĻžāĻ‡āĻŦā§āĻ°āĻŋāĻĄ āĻ•āĻžāĻ āĻžāĻŽā§‹āĨ¤ āĻāĻ–āĻžāĻ¨ā§‡ āĻ•āĻžāĻ°ā§āĻ¨ā§‡āĻ˛ āĻŽā§‹āĻĄā§‡āĻ° āĻŽāĻ¤ā§‹ āĻāĻ•āĻ‡ āĻ—āĻ āĻ¨ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€ āĻŽā§‹āĻĄ āĻ˛ā§āĻĒā§‡āĻ° āĻ¸āĻžāĻĨā§‡: SemaphorSlim, ManualResetEventSlim āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ Monitor, āĻ•āĻžāĻ°āĻŖ C# āĻ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ†āĻ›ā§‡ lock āĻŦāĻžāĻ•ā§āĻ¯ āĻ—āĻ āĻ¨. Monitor āĻāĻŸāĻŋ āĻāĻ•āĻ‡ āĻ¸ā§‡āĻŽāĻžāĻĢā§‹āĻ° āĻ¯āĻžāĻ° āĻ¸āĻ°ā§āĻŦā§‹āĻšā§āĻš āĻŽāĻžāĻ¨ 1 (mutex), āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ•āĻŸāĻŋ āĻ˛ā§āĻĒā§‡ āĻ…āĻĒā§‡āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨, āĻĒā§āĻ¨āĻ°āĻžāĻŦā§ƒāĻ¤ā§āĻ¤āĻŋ, āĻ•āĻ¨ā§āĻĄāĻŋāĻļāĻ¨ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻĒā§āĻ¯āĻžāĻŸāĻžāĻ°ā§āĻ¨ (āĻ¨ā§€āĻšā§‡ āĻ†āĻ°āĻ“ āĻŦā§‡āĻļāĻŋ), āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤ āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻĻā§‡āĻ–āĻž āĻ¯āĻžāĻ•āĨ¤

// ĐĄĐŋŅ€ŅŅ‡ĐĩĐŧ ОйŅŠĐĩĐēŅ‚ Đ´ĐģŅ МоĐŊиŅ‚ĐžŅ€Đ° ĐžŅ‚ вŅĐĩŅ…, Ņ‡Ņ‚ОйŅ‹ ĐąĐĩС Đ´ĐĩĐ´ĐģĐžĐēОв.
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 āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻ¸āĻŋāĻ™ā§āĻ•ā§āĻ°ā§‹āĻ¨āĻžāĻ‡āĻœā§‡āĻļāĻ¨ āĻ—āĻ āĻ¨ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¤āĻž āĻ¸āĻŦāĻ¸āĻŽāĻ¯āĻŧ āĻ¸ā§āĻĒāĻˇā§āĻŸ āĻ¨āĻ¯āĻŧāĨ¤ āĻ†āĻŽāĻŋ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻ›āĻŋāĻ˛ āĻ†āĻļāĻž āĻ•āĻ°āĻŋ. āĻ†āĻĒāĻžāĻ¤āĻ¤, āĻāĻŸāĻžāĻ‡ āĻļā§‡āĻˇ, āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻāĻ–āĻ¨āĻ“ āĻ…āĻ¨ā§‡āĻ• āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻœāĻŋāĻ¨āĻŋāĻ¸ āĻŦāĻžāĻ•āĻŋ āĻ†āĻ›ā§‡, āĻ¯ā§‡āĻŽāĻ¨, āĻĨā§āĻ°ā§‡āĻĄ-āĻ¸ā§‡āĻĢ āĻ•āĻžāĻ˛ā§‡āĻ•āĻļāĻ¨, āĻŸāĻŋāĻĒāĻŋāĻāĻ˛ āĻĄā§‡āĻŸāĻžāĻĢā§āĻ˛ā§‹, āĻ°āĻŋāĻ…ā§āĻ¯āĻžāĻ•āĻŸāĻŋāĻ­ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚, āĻ¸āĻĢāĻŸāĻ“āĻ¯āĻŧā§āĻ¯āĻžāĻ° āĻ˛ā§‡āĻ¨āĻĻā§‡āĻ¨ āĻŽāĻĄā§‡āĻ˛ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤

āĻ¸ā§‚āĻ¤ā§āĻ°

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨