рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЦрд┐рд▓рд╛рдпрд╛ рджрд╛рд░реНрд╢рдирд┐рдХ рдпрд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА .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); } 

рдзрд╛рдЧрд╛ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд╡рд┐рд▓реЛрдкрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдереНрд░реЗрдб рдкреВрд▓ред рдЗрд╕ рдкреВрд▓ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдп рдХрддрд╛рд░ рд╣реИ рдФрд░ рд╕реАрдПрд▓рдЖрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рдпрд╛ рд╣рдЯрд╛рддрд╛ рд╣реИред рд╕рднреА AppDomains рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд▓ред рдЗрд╕ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдереНрд░реЗрдбреНрд╕, рдЙрдирдХреА рдХрддрд╛рд░реЗрдВ рдмрдирд╛рдиреЗ, рд╣рдЯрд╛рдиреЗ рдЖрджрд┐ рд╕реЗ рдкрд░реЗрд╢рд╛рди рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреВрд▓ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЖрдкрдХреЛ рд╕реАрдзреЗ Thread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдЙрди рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рдереНрд░реЗрдб рдХреЗ рдлреЛрд░рдЧреНрд░рд╛рдЙрдВрдб рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рдФрд░ System.Threading.Tasks.Task рдХреНрд▓рд╛рд╕ рд╕рд┐рд░реНрдл рдЗрд╕ рдереНрд░реЗрдб рдкреВрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИред рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдпрд╣ рдПрдХ рд╣реА Thread , рд▓реЗрдХрд┐рди рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдЙрдкрдпреБрдХреНрддрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде: рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛, рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдирд╛, рдЙрдиреНрд╣реЗрдВ рдмрд╛рдзрд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдФрд░ рдХрдИ рдФрд░ред рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЯрд╛рд╕реНрдХ-рдЖрдзрд╛рд░рд┐рдд рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреИрдЯрд░реНрди, IAS рдСрдкрд░реЗрд╢рди рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА)ред рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред


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 ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдкрд░рдорд╛рдгреБ рдХреНрд░рдорд┐рдХ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╕реНрдкрд┐рдирд╡рд╛рдЗрдЯ while(true) рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ рдХреЗрд╡рд▓ рдереЛрдбрд╝рд╛ "рдЬрд╛рджреВ" рдХреЗ рд╕рд╛рде - рдзрд╛рдЧрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ ( Thread.SpinWait ) рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ ( Thread.Yeild ) рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рд╕реЛ рдЬрд╛рддрд╛ рд╣реИ ( Thread.Sleep ред рд╕реЛ)ред


рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рд╡рд╛рд╣ рдЬрд▓реНрдж рд╣реА рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛ (рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ рднреАрддрд░): рд╕рднреА рджрд╛рд░реНрд╢рдирд┐рдХ рдЕрдкрдиреЗ рдмрд╛рдПрдВ рдХрд╛рдВрдЯрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╣реА рдирд╣реАрдВред рдХрд╛рдВрдЯреЗ рд╕рд░рдгреА рдореЗрдВ рдорд╛рди рд╣реИрдВ: 1 2 3 4 5ред


Livelock


рдЪрд┐рддреНрд░рд╛ рдореЗрдВ, рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдирд╛ (рдЧрддрд┐рд░реЛрдз)ред рдЧреНрд░реАрди рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓рд╛рд▓ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЧреНрд░реЗ рдиреАрдВрдж рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣реАрд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдкреНрд░рд╛рд░рдВрдн рд╕рдордп рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред


рдж рд╣рдВрдЧрд░ рдСрдлрд╝ рдлрд┐рд▓реЙрд╕рдлрд╝рд░реНрд╕


рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рднреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХреЛ рднреА рджрд░реНрд╢рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдореЗрдВ рдЙрдкрд╡рд╛рд╕ рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рднреБрдЦрдорд░реА рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдзрд╛рд░рд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рдо рдХреЗ рдмрд┐рдирд╛, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рд╣реА рдЧрддрд┐рд░реЛрдз рд╣реИ, рдХреЗрд╡рд▓ рдЕрдм рдзрд╛рд░рд╛ рд╕реЛрддреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдвреВрдВрдв рд░рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреЛрдЬрди рдирд╣реАрдВ рд╣реИред рдмрд╛рд░-рдмрд╛рд░ рдЕрд╡рд░реБрджреНрдз рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд▓рдЧ рдХреЛ рд╡рд╛рдкрд╕ рд░рдЦ рджреЗрдВрдЧреЗ рдпрджрд┐ рд╣рдо рджреВрд╕рд░рд╛ рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗред


 //      RunDeadlock,         . private void RunStarvation(int i, CancellationToken token) { while (true) { bool hasTwoForks = false; var waitTime = TimeSpan.FromMilliseconds(50); //      : bool hasLeft = forks[Left(i)] == i + 1; if (hasLeft || TakeFork(Left(i), i + 1, waitTime)) { if (TakeFork(Right(i), i + 1, TimeSpan.Zero)) hasTwoForks = true; else PutFork(Left(i)); //      . } if (!hasTwoForks) { if (token.IsCancellationRequested) break; continue; } eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1); bool goodPhilosopher = i % 2 == 0; //        : if (goodPhilosopher) PutFork(Left(i)); //      ,      . PutFork(Right(i)); Think(i); if (token.IsCancellationRequested) break; } } //     . bool TakeFork(int fork, int philosopher, TimeSpan? waitTime = null) { return SpinWait.SpinUntil( () => Interlocked.CompareExchange(ref forks[fork], philosopher, 0) == 0, waitTime ?? TimeSpan.FromMilliseconds(-1) ); } 

рдЗрд╕ рд╕рдВрд╣рд┐рддрд╛ рдореЗрдВ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЪрд╛рд░ рдореЗрдВ рд╕реЗ рджреЛ рджрд╛рд░реНрд╢рдирд┐рдХ рдЕрдкрдиреЗ рдмрд╛рдПрдВ рдХрд╛рдВрдЯреЗ рдХреЛ рд░рдЦрдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╡реЗ рдЕрдзрд┐рдХ рднреЛрдЬрди рдЦрд╛рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рднреВрдЦреЗ рд░рд╣рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рд╕рдорд╛рди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рднреВрдЦреЗ рдирд╣реАрдВ рд░рд╣рддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдмреБрд░реЗ рджрд╛рд░реНрд╢рдирд┐рдХ рдХрднреА-рдХрднреА рдЕрдкрдиреЗ рдХрд╛рдВрдЯреЗ рд╡рд╛рдкрд╕ рд░рдЦ рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЕрдЪреНрдЫреЗ рд▓реЛрдЧ рдмреБрд░реЗ рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 5 рдЧреБрдирд╛ рдХрдо рдЦрд╛рддреЗ рд╣реИрдВред рддреЛ рдХреЛрдб рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рддреНрд░реБрдЯрд┐ рдкреНрд░рджрд░реНрд╢рди рдбреНрд░реЙрдк рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдПрдХ рджреБрд░реНрд▓рдн рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИ рдЬрдм рд╕рднреА рджрд╛рд░реНрд╢рдирд┐рдХ рдмрд╛рдПрдВ рдХрд╛рдВрдЯрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд╡реЗ рдмрд╛рдИрдВ рдУрд░ рд░рдЦрддреЗ рд╣реИрдВ, рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдмрд╛рдИрдВ рдУрд░ рдлрд┐рд░ рд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ, рдЖрджрд┐ред рдпрд╣ рд╕реНрдерд┐рддрд┐ рднреА рднреБрдЦрдорд░реА рдХреА рддрд░рд╣ рд╣реИ, рднреБрдЦрдорд░реА рд╣реИред рдореИрдВ рдЗрд╕реЗ рджреЛрд╣рд░рд╛ рдирд╣реАрдВ рд╕рдХрд╛ред рдиреАрдЪреЗ рдПрдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рддрд╕реНрд╡реАрд░ рд╣реИ, рдЬрд╣рд╛рдВ рджреЛ рдмреБрд░реЗ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдиреЗ рджреЛрдиреЛрдВ рдХрд╛рдВрдЯреЗ рд▓реЗ рд▓рд┐рдП рд╣реИрдВ рдФрд░ рджреЛ рдЕрдЪреНрдЫреЗ рджрд╛рд░реНрд╢рдирд┐рдХ рднреВрдЦ рд╕реЗ рдорд░ рд░рд╣реЗ рд╣реИрдВред


рдЕрдХрд╛рд▓


рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдзрд╛рдЧреЗ рдХрднреА-рдХрднреА рдЙрдарддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЪрд╛рд░ рдореЗрдВ рд╕реЗ рджреЛ рдХреЛрд░ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рд╢реАрд░реНрд╖ рдкрд░ рд╣рд░рд╛ рдЧреНрд░рд╛рдл)ред


рджрд╛рд░реНрд╢рдирд┐рдХ рдХреА рдореГрддреНрдпреБ


рдЦреИрд░, рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдЬреЛ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЗ рд╢рд╛рдирджрд╛рд░ рд░рд╛рддреНрд░рд┐рднреЛрдЬ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИ, рдЕрдЧрд░ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЕрдЪрд╛рдирдХ рдЙрд╕рдХреЗ рд╣рд╛рдереЛрдВ рдореЗрдВ рдХрд╛рдВрдЯреЗ рдХреЗ рд╕рд╛рде рдорд░ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рд╡реЗ рдЙрд╕реЗ рдЙрд╕реА рддрд░рд╣ рджрдлрди рдХрд░ рджреЗрдВрдЧреЗ)ред рдлрд┐рд░ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рджреЛрдкрд╣рд░ рдХреЗ рднреЛрдЬрди рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рд╕реНрд╡рдпрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП NullReferenceException рдирдореВрдирд╛ рдХреЛрдб NullReferenceException рд╕рдХрддреЗ NullReferenceException , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рдХрд╛рдВрдЯреЗ рд▓реЗрдиреЗ рдХреЗ рдмрд╛рдж 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; } while(true) { if (!lock) break; } , рд▓реЗрдХрд┐рди SpinWait (рдЬреЛ рд╡рд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдФрд░ рднреА рдЕрдзрд┐рдХ "рдЬрд╛рджреВ" рдХреЗ рд╕рд╛рдеред рдЕрдм рд╡рд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рд▓реЛрдЧ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдЧрд┐рдиреЗрдВ, рдЙрдиреНрд╣реЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рд╕реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓ рджреЗрдВред рдЖрджрд┐ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рд╕рдВрднрд╡ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ рдЕрднреА рднреА рдПрдХ рд╣реА рд╕рдХреНрд░рд┐рдп рдЪрдХреНрд░ рд╣реИ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдзрд╛рдЧрд╛ рд░рдЦрддрд╛ рд╣реИ рдЬреЛ рднреБрдЦрдорд░реА рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджреВрд╕рд░реЛрдВ рдкрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реБрдирд╣рд░рд╛ рдХрд╛рдВрдЯрд╛ (рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдЙрд▓рдЯрд╛ рд╕рдорд╕реНрдпрд╛) рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХреЗрд╡рд▓ рдХрд┐рд╕реА рднреА рддреГрддреАрдп-рдкрдХреНрд╖ рдХреЙрд▓, рдиреЗрд╕реНрдЯреЗрдб рддрд╛рд▓реЗ, рдЖрджрд┐ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рдмрд┐рдирд╛ рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрд╣реБрдд рд╣реА рдХрдо рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


spinlock


SpinLock рд▓рд┐рдП рдЪрд┐рддреНрд░рд╛ред рдЧреЛрд▓реНрдбрди рдлреЛрд░реНрдХ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рдПрдВ рд▓рдЧрд╛рддрд╛рд░ "рд▓рдбрд╝" рд░рд╣реА рд╣реИрдВред рд╡рд┐рдлрд▓рддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ - рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ, рдЪрдпрдирд┐рдд рдХреНрд╖реЗрддреНрд░ред рдХреЛрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ: рдХреЗрд╡рд▓ рдЗрди рдЪрд╛рд░ рдзрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рд▓рдЧрднрдЧ 2/3ред


рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдЙрдкрд╛рдп рдХреЗрд╡рд▓ рдЙрд╕реА рд╕рдХреНрд░рд┐рдп рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде Interlocked.CompareExchange рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдХреЛрдб рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ (рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЛ рднреВрдЦ рд╕реЗ рдорд░рдирд╛), рд▓реЗрдХрд┐рди рдпрд╣, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░ рд╕рдХрддрд╛ рд╣реИред


CompareExchange рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ CompareExchange рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдкрд░рдорд╛рдгреБ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВред рдФрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ (1 рдкрдврд╝реЗрдВ, 2 рдкрдврд╝реЗрдВ, 2 рд▓рд┐рдЦреЗрдВ, 1 рд▓рд┐рдЦреЗрдВ рдмреБрд░рд╛ рд╣реИ), рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдЬрдЯрд┐рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ (рдЗрдВрдЯрд░рд▓реЙрдХ рдХрд┐рдП рдЧрдП рдХреБрдЫ рднреА рдкреИрдЯрд░реНрди) рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдХрд░реНрдиреЗрд▓ рдореЛрдб рд╕рдорд╛рдзрд╛рди


рдПрдХ рд▓реВрдк рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдЦреЛрдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХреИрд╕реЗ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реБрдП, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рд╡реЗрдЯрд░ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рд╕реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реА рдЙрд╕реЗ рдЬрдЧрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдерд╛рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╡рд╣рд╛рдБ рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдПрдБ рдкреНрд░рд╛рдпрдГ рдзреАрдореА рд╣реЛрддреА рд╣реИрдВред рдХрдИ рдмрд╛рд░ рдзреАрдореА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП AutoResetEvent SpinLock [рд░рд┐рдХреНрдЯрд░] рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 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 рдСрдмреНрдЬреЗрдХреНрдЯ AutoResetEvent рдЧрдпрд╛ рд╣реИ ( Enumerable.Repeat ), рддреЛ рджрд╛рд░реНрд╢рдирд┐рдХ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЦреЛрдЬрдирд╛ рдПрдХ рдХрдард┐рди рдХрд╛рдо рд╣реИред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА рджрд╛рд░реНрд╢рдирд┐рдХ рднреВрдЦрд╛ рдирд╣реАрдВ рд░рд╣реЗрдЧрд╛ред


рд╣рд╛рдЗрдмреНрд░рд┐рдб рд╕рдорд╛рдзрд╛рди


рдЬрдм рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рд▓реВрдк рдореЗрдВ рд╕реНрдкрд┐рди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рд╣рдо рдХрд░реНрдиреЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдордиреЗ рджреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреАред рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдЫреЛрдЯреЗ рддрд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд▓рдВрдмреЗ рддрд╛рд▓реЛрдВ рдХреЗ рд▓рд┐рдПред рдЕрдХреНрд╕рд░, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд▓реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪрд░ рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рд▓рдВрдмреА рд╣реЛрдиреЗ рдкрд░ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рддрдерд╛рдХрдерд┐рдд рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╕рдВрдХрд░ рдбрд┐рдЬрд╛рдЗрдиред рд╡рд╣реА ManualResetEventSlim рд╣реИрдВ рдЬреЛ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдХреЗ рд▓рд┐рдП рдереАрдВ, рд▓реЗрдХрд┐рди рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рдореЗрдВ рдПрдХ рд▓реВрдк рдХреЗ рд╕рд╛рде: SemaphorSlim , ManualResetEventSlim , рдЖрджрд┐ред рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдирд┐рд░реНрдорд╛рдг Monitor , рдХреНрдпреЛрдВрдХрд┐ C # рдореЗрдВ рдПрдХ рдкреНрд░рд╕рд┐рджреНрдз lock рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣реИред Monitor 1 (рдореНрдпреВрдЯреЗрдХреНрд╕) рдХреЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕реЗрдорд╛рдлреЛрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд▓реВрдк, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐, рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреИрдЯрд░реНрди (рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗ), рдЖрджрд┐ рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЪрд▓реЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╛рдзрд╛рди рджреЗрдЦреЗрдВред


 //      ,   . private readonly object _lock = new object(); //   . private DateTime?[] _waitTimes = new DateTime?[philosophersAmount]; public void Run(int i, CancellationToken token) { while (true) { TakeForks(i); eatenFood[i] = (eatenFood[i] + 1) % (int.MaxValue - 1); PutForks(i); Think(i); if (token.IsCancellationRequested) break; } } //     Condition Variable . bool CanIEat(int i) { //   : if (forks[Left(i)] != 0 && forks[Right(i)] != 0) return false; var now = DateTime.Now; // ,     ,  . foreach(var p in new int[] {LeftPhilosopher(i), RightPhilosopher(i)}) if (_waitTimes[p] != null && now - _waitTimes[p] > now - _waitTimes[i]) return false; return true; } void TakeForks(int i) { //   .   : lock(_lock) {..}. //   try,     . bool lockTaken = false; Monitor.Enter(_lock, ref lockTaken); try { _waitTimes[i] = DateTime.Now; // Condition Variable .  ,    //  .    -  Pulse / PulseAll. while (!CanIEat(i)) Monitor.Wait(_lock); forks[Left(i)] = i + 1; forks[Right(i)] = i + 1; _waitTimes[i] = null; } finally { if (lockTaken) Monitor.Exit(_lock); } } void PutForks(int i) { //   : lock (_lock) {..}. bool lockTaken = false; Monitor.Enter(_lock, ref lockTaken); try { forks[Left(i)] = 0; forks[Right(i)] = 0; //        Monitor.Exit. Monitor.PulseAll(_lock); } finally { if (lockTaken) Monitor.Exit(_lock); } } 

рдпрд╣рд╛рдВ рд╣рдо рдлрд╝реЙрд░реНрдХреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдкреВрд░реА рдореЗрдЬ рдкрд░ рддрд╛рд▓рд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЬрдм рдХреЛрдИ рдЦрд╛рдирд╛ рдЦрддреНрдо рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдХреЛрдИ рдЗрд╕реЗ рдЦрддреНрдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдлрд┐рд░ рд╕реЗ рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рддрд╛рд▓рд╛ рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдХреЛ рдЬрдЧрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдордп рдХрдо рд╣реИред


рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреБрдЫ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЗ рдЧрддрд┐рд░реЛрдз рдФрд░ рднреБрдЦрдорд░реА рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдЫреЛрдЯреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХрддреЗ рд╣реИрдВред AutoResetEvent рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдкрдбрд╝реЛрд╕реА рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рд╕рднреА рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдВрддрд░ рдмрдбрд╝рд╛ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдереНрд░реЗрдб рдкрд╣рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рдореЗрдВ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред


рд╕рд┐рдВрдЯреИрдХреНрд╕ lock рдореЗрдВ рдЕрдкреНрд░рд┐рдп рдЖрд╢реНрдЪрд░реНрдп рд╣реИред рд╡реЗ рд╕реАрдзреЗ [рд░рд┐рдХреНрдЯрд░] [рдПрд░рд┐рдХ рд▓рд┐рдкрд░реНрдЯ] Monitor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддреЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ lock рд╣рдореЗрд╢рд╛ Monitor рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдПрдХ рдЕрдкрд╡рд╛рдж рдерд╛, рдФрд░ рдлрд┐рд░ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрдХреНрд╕рд░ рдЧрддрд┐рд░реЛрдз рдкрд░ рдЬрд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдФрд░ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реИ рдХрд┐ рдореЙрдирд┐рдЯрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдмреНрд▓реЙрдХ ( SyncBlock ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЧрд▓рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЧрддрд┐рд░реЛрдз рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрдВрдЯрд░реНрдирдб рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рд▓реЙрдХ рдмрдирд╛рддреЗ рд╣реИрдВ)ред рд╣рдо рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЫрд┐рдкреА рд╣реБрдИ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред


рд╕реНрдерд┐рддрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкреИрдЯрд░реНрди рдЖрдкрдХреЛ рдПрдХ рдЬрдЯрд┐рд▓ рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред .NET рдореЗрдВ, рдпрд╣ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдЕрдзреВрд░рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдХрдИ рдЪрд░ рдкрд░ рдХрдИ рдХрддрд╛рд░реЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдЬреИрд╕рд╛ рдХрд┐ рдкреЙрдЬрд╝рд┐рдХреНрд╕ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ), рдФрд░ рдПрдХ рд▓реЙрдХ рдкрд░ рдирд╣реАрдВред рддрдм рдХреЛрдИ рдЙрдиреНрд╣реЗрдВ рд╕рднреА рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╕рдХрддрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рд░реВрдк рдореЗрдВ рднреА, рдпрд╣ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдХрдИ рджрд╛рд░реНрд╢рдирд┐рдХ рдпрд╛ async / await


рдареАрдХ рд╣реИ, рдЕрдм рд╣рдо рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рдЕрдЧрд░ рд╣рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рджрд╛рд░реНрд╢рдирд┐рдХ рдорд┐рд▓реЗ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? 100? 10,000? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ 100,000 рдЕрдиреБрд░реЛрдз рдорд┐рд▓реЗред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдирд╛ рдУрд╡рд░рд╣реЗрдб рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрддрдиреЗ рд╕рд╛рд░реЗ рдзрд╛рдЧреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдХреЗрд╡рд▓ рдХрдИ рддрд╛рд░реНрдХрд┐рдХ рдХреЛрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ (рдореЗрд░реЗ рдкрд╛рд╕ 4 рд╣реИрдВ)ред рдФрд░ рдмрд╛рдХреА рд╕рднреА рд▓реЛрдЧ рдХреЗрд╡рд▓ рд╕рдВрд╕рд╛рдзрди рд▓реЗрдВрдЧреЗред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдкреИрдЯрд░реНрди рд╣реИред рдЗрд╕рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реНрдЯреНрд░реАрдо рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдЬрдм, рд╡рд╣ рдХреБрдЫ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╣ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреА рд╣реИ (рд▓реЗрдХрд┐рди рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рдЙрд╕реА рдзрд╛рдЧреЗ рдореЗрдВ!)ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреНрд▓рдЧ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗред


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 . Monitor 4 , . 4 2. async / await 100, 6.8 . , 6 . Monitor .


рдирд┐рд╖реНрдХрд░реНрд╖


, .NET . , , , . . , , , TPL Dataflow, Reactive , Software Transaction .


рд╕реВрддреНрд░реЛрдВ рдХрд╛ рдХрд╣рдирд╛ рд╣реИ


Source: https://habr.com/ru/post/hi447898/


All Articles