рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдФрд░ рд╕реАрдПрд╕рдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реА ++ рдореЗрдВ "рдЖрдзреБрдирд┐рдХ" рднреЛрдЬрди рджрд╛рд░реНрд╢рдирд┐рдХ

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


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддрд╛ рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рд╕рдорд╛рдзрд╛рди рдореБрдЭреЗ рд╕рд░рд▓ рдФрд░ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрднрд╡рддрдГ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рд╕реНрдкреИрдЪрд░ / рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдФрд░ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдХрд╣рд╛рдВ, рдХрдм, рдФрд░ рдХреМрди рд╕реЗ рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


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


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


рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрдж


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


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


рдпрд╣ "рдбрд╛рдЗрдирд┐рдВрдЧ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ" рдХреЗ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдмреЛрдз рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереАред рдЙрд╕реА рд╕рдордп, рдХреБрдЫ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдиреЗ рдЙрд▓реНрд▓реЗрдЦрд┐рдд рд▓реЗрдЦ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, ForkLevelPhilosopherProtocol рдФрд░ WaiterFair рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд) рдХреЗ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред


рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдирд┐рд░реНрдгрдп SObjectizer рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдП , рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрд╣рд▓реЗ рдореЗрд░реЗ рд▓реЗрдЦ рдкрдврд╝реЗ рд╣реИрдВред рдпрджрд┐ рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ SObjectizer рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ, рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдпрд╣ C ++ ( CAF рдФрд░ QP / C ++ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдХреЗ рдХреБрдЫ рд▓рд╛рдЗрд╡ рдФрд░ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдУрдкрдирд╕реЛрд░реНрд╕ "рдЕрднрд┐рдиреЗрддрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ" рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг SObjectizer рд╕реЗ рдЕрдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрдВрдЧреЗред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдореБрдЭреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред


рдЕрднрд┐рдиреЗрддрд╛ рд╕рдорд╛рдзрд╛рди


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


рджреАрдЬрдХрд╕реНрдЯреНрд░рд╛ рдХрд╛ рдлреИрд╕рд▓рд╛


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


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдПрдХ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рд╕рдВрдЦреНрдпрд╛ 5 рдФрд░ 6 рдХреЗ рд╕рд╛рде рдХрд╛рдВрдЯреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдПрдХ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рдкрд╣рд▓реЗ рд╕рдВрдЦреНрдпрд╛ 5 рдХрд╛ рдПрдХ рдХрд╛рдВрдЯрд╛ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╡рд╣ рд╕рдВрдЦреНрдпрд╛ 6 рдХрд╛ рдПрдХ рдХрд╛рдВрдЯрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдпрджрд┐ рдХрдо рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рдХрд╛рдВрдЯреЗ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рд╣реИрдВ, рддреЛ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рдЪрд╛рд╣рд┐рдП рдкрд╣рд▓реЗ рдмрд╛рдПрдВ рдХрд╛рдВрдЯреЗ рдХреЛ рд▓реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╡рд╣ рджрд╛рдпрд╛рдВ рдХрд╛рдВрдЯрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред


рд╕реВрдЪреА рдореЗрдВ рдЕрдВрддрд┐рдо рджрд╛рд░реНрд╢рдирд┐рдХ, рдЬрд┐рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ (N-1) рдФрд░ 0 рдкрд░ рдХрд╛рдВрдЯреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рд╡рд┐рдкрд░реАрдд рдХрд░рддрд╛ рд╣реИ: рд╡рд╣ рдкрд╣рд▓реЗ рдирдВрдмрд░ 0 рдХреЗ рд╕рд╛рде рджрд╛рдпрд╛рдБ рдХрд╛рдВрдЯрд╛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдирдВрдмрд░ (N-1) рдХреЗ рд╕рд╛рде рдмрд╛рдПрдБ рдХрд╛рдВрдЯрд╛ рд▓реЗрддрд╛ рд╣реИред


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА: рдПрдХ рдХрд╛рдВрдЯреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдХрд╛рдВрдЯреЗ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рдВрдЯрд╛ рдЕрднрд┐рдиреЗрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдХрд╛рдВрдЯрд╛ рдЕрднрд┐рдиреЗрддрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред


рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рд╕рдВрджреЗрд╢реЛрдВ


рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЙрди рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЕрднрд┐рдиреЗрддрд╛ рд╡рд┐рдирд┐рдордп рдХрд░реЗрдВрдЧреЗ:


struct take_t { const so_5::mbox_t m_who; std::size_t m_philosopher_index; }; struct taken_t : public so_5::signal_t {}; struct put_t : public so_5::signal_t {}; 

рдЬрдм рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ рдкреНрд▓рдЧ рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдХрд╛рдВрдЯрд╛ take_t рдХреЛ take_t рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдХрд╛рдВрдЯрд╛ рдЕрднрд┐рдиреЗрддрд╛ рдиреЗ taken_t рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдЬрд╡рд╛рдм рджрд┐рдпрд╛ред рдЬрдм рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ рдЦрд╛рдиреЗ рдХреЛ рдЦрддреНрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдВрдЯреЗ рдХреЛ рд╡рд╛рдкрд╕ рдореЗрдЬ рдкрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ put_t -forks рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред


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


рдЕрднрд┐рдиреЗрддрд╛ рдХрд╛ рдХрд╛рдВрдЯрд╛


рдЕрдм рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдХрд╛рдВрдЯрд╛ рдЕрднрд┐рдиреЗрддрд╛ рдХреНрдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ:


 class fork_t final : public so_5::agent_t { public : fork_t( context_t ctx ) : so_5::agent_t{ std::move(ctx) } {} void so_define_agent() override { //     'free'. this >>= st_free; //   'free'    . st_free .event( [this]( mhood_t<take_t> cmd ) { this >>= st_taken; so_5::send< taken_t >( cmd->m_who ); } ); //   'taken'   . st_taken .event( [this]( mhood_t<take_t> cmd ) { //     . m_queue.push( cmd->m_who ); } ) .event( [this]( mhood_t<put_t> ) { if( m_queue.empty() ) //     . this >>= st_free; else { //      . const auto who = m_queue.front(); m_queue.pop(); so_5::send< taken_t >( who ); } } ); } private : //    . const state_t st_free{ this, "free" }; const state_t st_taken{ this, "taken" }; //   . std::queue< so_5::mbox_t > m_queue; }; 

SObjectizer рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рдиреЗрддрд╛ рдХреЛ рдмреЗрд╕ рдХреНрд▓рд╛рд╕ agent_t рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдпрд╣рд╛рдБ рдЯрд╛рдЗрдк fork_t рд▓рд┐рдП рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВред


so_define_agent() рд╡рд┐рдзрд┐ so_define_agent() рд╡рд░реНрдЧ рдореЗрдВ рдУрд╡рд░рд░рд╛рдЗрдб рдХреА so_define_agent() ред рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рд╣реИ, рдпрд╣ рдПрдХ рдирдП рдПрдЬреЗрдВрдЯ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╕рдордп SObjectizer рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред so_define_agent() рд╡рд┐рдзрд┐ рдореЗрдВ, so_define_agent() SObjectizer рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдХреЙрдиреНрдлрд╝рд┐рдЧрд░" рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкреНрд░рд╛рд░рдВрдн рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХ рд╕рдВрджреЗрд╢ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


SObjectizer рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рдиреЗрддрд╛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рд╣реИ (рднрд▓реЗ рд╣реА рдЕрднрд┐рдиреЗрддрд╛ рдХреЗрд╡рд▓ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред fork_t рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рджреЛ рд░рд╛рдЬреНрдп рд╣реИрдВ: рдирд┐рдГрд╢реБрд▓реНрдХ рдФрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ ред рдЬрдм рдХреЛрдИ рдЕрднрд┐рдиреЗрддрд╛ рд╕реНрд╡рддрдВрддреНрд░ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рджрд╛рд░реНрд╢рдирд┐рдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд▓рдЧ рдХреЛ "рдХреИрдкреНрдЪрд░" рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдФрд░ "рдХрд╛рдВрдЯрд╛" рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, fork_t рдЕрднрд┐рдиреЗрддрд╛ рдХреЛ рд▓рд┐рдпрд╛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред fork_t рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░ fork_t рд╕реНрдЯреЗрдЯреНрд╕ рдХреЛ рд╡рд┐рд╢реЗрд╖ state_t рдкреНрд░рдХрд╛рд░ рдХреЗ st_free рдФрд░ st_taken рдЙрджрд╛рд╣рд░рдгреЛрдВ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд░рд╛рдЬреНрдп рдЖрдкрдХреЛ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдХреНрдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ, рдПрдЬреЗрдВрдЯ рдХреЗрд╡рд▓ take_t рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛрддреА рд╣реИ: рдЕрднрд┐рдиреЗрддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ рдФрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛_ taken_t :


 st_free .event( [this]( mhood_t<take_t> cmd ) { this >>= st_taken; so_5::send< taken_t >( cmd->m_who ); } ); 

рдЬрдмрдХрд┐ рдореБрдХреНрдд рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ put_t рд╕рд╣рд┐рдд рдЕрдиреНрдп рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рд▓реА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЕрднрд┐рдиреЗрддрд╛ рджреЛ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ take_t рд╕рдВрджреЗрд╢ рдХреЛ рднреА рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:


 st_taken .event( [this]( mhood_t<take_t> cmd ) { m_queue.push( cmd->m_who ); } ) .event( [this]( mhood_t<put_t> ) { if( m_queue.empty() ) this >>= st_free; else { const auto who = m_queue.front(); m_queue.pop(); so_5::send< taken_t >( who ); } } ); 

put_t рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ put_t рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк put_t : рдпрджрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреА рдХрддрд╛рд░ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╣рдо рдореБрдлреНрдд рдореЗрдВ рд▓реМрдЯ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдпрд╣ рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдирдореЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред


рджрд╛рд░реНрд╢рдирд┐рдХ рдЕрднрд┐рдиреЗрддрд╛


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


рдПрдХ рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рд░рд╛рдЬреНрдп рд╣реИрдВ:


 state_t st_thinking{ this, "thinking.normal" }; state_t st_wait_left{ this, "wait_left" }; state_t st_wait_right{ this, "wait_right" }; state_t st_eating{ this, "eating" }; state_t st_done{ this, "done" }; 

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


рдПрдХ рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдЪрд┐рддреНрд░ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


рдЫрд╡рд┐


рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рддрд░реНрдХ рдЙрд╕рдХреЗ so_define_agent() рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ:


 void so_define_agent() override { //   thinking     stop_thinking. st_thinking .event( [=]( mhood_t<stop_thinking_t> ) { //    . this >>= st_wait_left; so_5::send< take_t >( m_left_fork, so_direct_mbox(), m_index ); } ); //        taken. st_wait_left .event( [=]( mhood_t<taken_t> ) { //     .   . this >>= st_wait_right; so_5::send< take_t >( m_right_fork, so_direct_mbox(), m_index ); } ); //    ,    taken. st_wait_right .event( [=]( mhood_t<taken_t> ) { //    ,  . this >>= st_eating; } ); //      stop_eating. st_eating // 'stop_eating'        'eating'. .on_enter( [=] { so_5::send_delayed< stop_eating_t >( *this, eat_pause() ); } ) .event( [=]( mhood_t<stop_eating_t> ) { //      . so_5::send< put_t >( m_right_fork ); so_5::send< put_t >( m_left_fork ); //     . ++m_meals_eaten; if( m_meals_count == m_meals_eaten ) this >>= st_done; //  ,  ,  . else think(); } ); st_done .on_enter( [=] { //   ,   . completion_watcher_t::done( so_environment(), m_index ); } ); } 

рд╢рд╛рдпрдж рдПрдХрдорд╛рддреНрд░ рдмрд┐рдВрджреБ рдЬрд┐рд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреЛрд░ рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рд╡рд╣ "рд╕реЛрдЪ" рдФрд░ "рдЦрд╛рдиреЗ" рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирдХрд▓ рдХрд░рдиреЗ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рдХреЛрдб рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ this_thread::sleep_for рдирд╣реАрдВ this_thread::sleep_for рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд▓рдВрдмрд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдХреЛрдИ рдЕрднрд┐рдиреЗрддрд╛ рдЦрд╛рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЦреБрдж рдХреЛ рдПрдХ рд▓рдВрдмрд┐рдд stop_eating_t рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрджреЗрд╢ SObjectizer рдЯрд╛рдЗрдорд░ рдХреЛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рдордп рдЖрдиреЗ рдкрд░ рдЯрд╛рдЗрдорд░ рдЕрднрд┐рдиреЗрддрд╛ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред


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


рдкрд░рд┐рдгрд╛рдо


рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рдЫреЛрдЯрд╛ рдЯреБрдХрдбрд╝рд╛):


  Socrates: tttttttttttLRRRRRRRRRRRRRREEEEEEEttttttttLRRRRRRRRRRRRRREEEEEEEEEEEEE Plato: ttttttttttEEEEEEEEEEEEEEEEttttttttttRRRRRREEEEEEEEEEEEEEttttttttttLLL Aristotle: ttttEEEEEtttttttttttLLLLLLRRRREEEEEEEEEEEEttttttttttttLLEEEEEEEEEEEEE Descartes: tttttLLLLRRRRRRRREEEEEEEEEEEEEtttLLLLLLLLLRRRRREEEEEEttttttttttLLLLLL Spinoza: ttttEEEEEEEEEEEEEttttttttttLLLRRRREEEEEEEEEEEEEttttttttttRRRREEEEEEtt Kant: ttttttttttLLLLLLLRREEEEEEEEEEEEEEEttttttttttLLLEEEEEEEEEEEEEEtttttttt Schopenhauer: ttttttEEEEEEEEEEEEEttttttLLLLLLLLLEEEEEEEEEttttttttLLLLLLLLLLRRRRRRRR Nietzsche: tttttttttLLLLLLLLLLEEEEEEEEEEEEEttttttttLLLEEEEEEEEEttttttttRRRRRRRRE Wittgenstein: ttttEEEEEEEEEEtttttLLLLLLLLLLLLLEEEEEEEEEttttttttttttRRRREEEEEEEEEEEt Heidegger: tttttttttttLLLEEEEEEEEEEEEEEtttttttLLLLLLREEEEEEEEEEEEEEEtttLLLLLLLLR Sartre: tttEEEEEEEEEttttLLLLLLLLLLLLRRRRREEEEEEEEEtttttttLLLLLLLLRRRRRRRRRRRR 

рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрдврд╝реЗрдВ:


  • t рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ "рд╕реЛрдЪ" рд╣реИ;
  • L рдорддрд▓рдм рд╣реИ рдХрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рдмрд╛рдПрдВ рдХрд╛рдВрдЯреЗ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ ( рдкреНрд░рддреАрдХреНрд╖рд╛_рд▓реЗрдлреНрдЯ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реИ);
  • R рдорддрд▓рдм рд╣реИ рдХрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ рд╕рд╣реА рдХрд╛рдВрдЯреЗ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░ рд░рд╣рд╛ рд╣реИ ( рдЗрдВрддрдЬрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ);
  • E рдЕрд░реНрде рд╣реИ рдХрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ "рдЦрд╛рддрд╛ рд╣реИред"

рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рд░реНрддреНрд░ рдХреЗ рджреВрд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕реБрдХрд░рд╛рдд рдмрд╛рдИрдВ рдУрд░ рдХрд╛рдВрдЯрд╛ рд▓реЗ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реБрдХрд░рд╛рдд рддрдм рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдЧрд╛ рдЬрдм рддрдХ рдкреНрд▓реЗрдЯреЛ рд╕рд╣реА рдХрд╛рдВрдЯрд╛ рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рддрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╕реБрдХрд░рд╛рдд рдЦрд╛ рд╕рдХреЗрдВрдЧреЗред


рдордзреНрдпрд╕реНрде (рд╡реЗрдЯрд░) рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╕рд░рд▓ рдирд┐рд░реНрдгрдп


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


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


рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдФрд░ рдЗрд╕реА рджрд╛рд░реНрд╢рдирд┐рдХ рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдпрд╣рд╛рдБ ред


рд╕рдВрджреЗрд╢реЛрдВ


рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:


 struct take_t { const so_5::mbox_t m_who; std::size_t m_philosopher_index; }; struct busy_t : public so_5::signal_t {}; struct taken_t : public so_5::signal_t {}; struct put_t : public so_5::signal_t {}; 

рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ busy_t рд╕рд┐рдЧреНрдирд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реИред рдЕрднрд┐рдиреЗрддрд╛-рдХрд╛рдВрдЯрд╛ рджрд╛рд░реНрд╢рдирд┐рдХ-рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдпрд╣ рд╕рдВрдХреЗрдд рднреЗрдЬрддрд╛ рд╣реИ рдпрджрд┐ рдХрд╛рдВрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдЕрдиреНрдп рджрд╛рд░реНрд╢рдирд┐рдХ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛред


рдЕрднрд┐рдиреЗрддрд╛ рдХрд╛ рдХрд╛рдВрдЯрд╛


рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдХрд╛рдВрдЯрд╛ рдЕрднрд┐рдиреЗрддрд╛, рджрд┐рдЬреНрдХреНрд╕реНрдЯреНрд░рд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рднреА рд╕рд░рд▓ рд╣реИ:


 class fork_t final : public so_5::agent_t { public : fork_t( context_t ctx ) : so_5::agent_t( ctx ) { this >>= st_free; st_free.event( [this]( mhood_t<take_t> cmd ) { this >>= st_taken; so_5::send< taken_t >( cmd->m_who ); } ); st_taken.event( []( mhood_t<take_t> cmd ) { so_5::send< busy_t >( cmd->m_who ); } ) .just_switch_to< put_t >( st_free ); } private : const state_t st_free{ this }; const state_t st_taken{ this }; }; 

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рджрд╛рд░реНрд╢рдирд┐рдХреЛрдВ рдХреА рдХрддрд╛рд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред


рджрд╛рд░реНрд╢рдирд┐рдХ рдЕрднрд┐рдиреЗрддрд╛


рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рджрд╛рд░реНрд╢рдирд┐рдХ-рдЕрднрд┐рдиреЗрддрд╛, рджрд┐рдЬреНрдХреНрд╕реНрдЯреНрд░рд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рджрд╛рд░реНрд╢рдирд┐рдХ-рдЕрднрд┐рдиреЗрддрд╛ рдХреЛ busy_t рдкреНрд░рдХреНрд░рд┐рдпрд╛ busy_t , рдЗрд╕рд▓рд┐рдП рд░рд╛рдЬреНрдп рдЪрд┐рддреНрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдЫрд╡рд┐


рдЗрд╕реА рддрд░рд╣, рдПрдХ рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ рдХрд╛ рдкреВрд░рд╛ рддрд░реНрдХ so_define_agent() рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 void so_define_agent() override { st_thinking .event< stop_thinking_t >( [=] { this >>= st_wait_left; so_5::send< take_t >( m_left_fork, so_direct_mbox(), m_index ); } ); st_wait_left .event< taken_t >( [=] { this >>= st_wait_right; so_5::send< take_t >( m_right_fork, so_direct_mbox(), m_index ); } ) .event< busy_t >( [=] { think( st_hungry_thinking ); } ); st_wait_right .event< taken_t >( [=] { this >>= st_eating; } ) .event< busy_t >( [=] { so_5::send< put_t >( m_left_fork ); think( st_hungry_thinking ); } ); st_eating .on_enter( [=] { so_5::send_delayed< stop_eating_t >( *this, eat_pause() ); } ) .event< stop_eating_t >( [=] { so_5::send< put_t >( m_right_fork ); so_5::send< put_t >( m_left_fork ); ++m_meals_eaten; if( m_meals_count == m_meals_eaten ) this >>= st_done; else think( st_normal_thinking ); } ); st_done .on_enter( [=] { completion_watcher_t::done( so_environment(), m_index ); } ); } 

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рджрд┐рдЬреНрдХреНрд╕реНрдЯреНрд░рд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рд▓рдЧрднрдЧ рд╕рдорд╛рди рдХреЛрдб рд╣реИ, busy_t рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░реНрд╕ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред


рдкрд░рд┐рдгрд╛рдо


рдХрд╛рд░реНрдп рдХреЗ рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ рджрд┐рдЦрддреЗ рд╣реИрдВ:


  Socrates: tttttttttL..R.....EEEEEEEEEEEEttttttttttR...LL..EEEEEEEttEEEEEE Plato: ttttEEEEEEEEEEEttttttL.....L..EEEEEEEEEEEEEEEttttttttttL....L.... Aristotle: ttttttttttttL..LR.EEEEEEtttttttttttL..L....L....R.....EEEEEEEEE Descartes: ttttttttttEEEEEEEEttttttttttttEEEEEEEEttttEEEEEEEEEEEttttttL..L.. Spinoza: ttttttttttL.....L...EEEEEEtttttttttL.L......L....L..L...R...R...E Kant: tttttttEEEEEEEttttttttL.L.....EEEEEEEEttttttttR...R..R..EEEEEtttt Schopenhauer: tttR..R..L.....EEEEEEEttttttR.....L...EEEEEEEEEEEEEEEEttttttttttt Nietzsche: tttEEEEEEEEEEtttttttttEEEEEEEEEEEEEEEttttL....L...L..L....EEEEEEE Wittgenstein: tttttL.L..L.....RR....L.....L....L...EEEEEEEEEEEEEEEtttttttttL. Heidegger: ttttR..R......EEEEEEEEEEEEEttttttttttR..L...L...L..L...EEEEtttttt Sartre: tttEEEEEEEtttttttL..L...L....R.EEEEEEEtttttEEEEtttttttR.....R..R. 

рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдирдпрд╛ рдкреНрд░рддреАрдХ рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ "рднреВрдЦреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ" рдореЗрдВ рд╣реИред


рдЗрд╕ рдЫреЛрдЯреЗ рд╕реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рднреА, рдХреЛрдИ рднреА рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд▓рдВрдмреЗ рд╕рдордп рдХреЗ рджреМрд░рд╛рди рджрд╛рд░реНрд╢рдирд┐рдХ рднреЛрдЬрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЧрддрд┐рд░реЛрдз рдХреА рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рднреБрдЦрдорд░реА рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдирд╣реАрдВ рд╣реИред


рд╡реЗрдЯрд░ рдФрд░ рдХрддрд╛рд░ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдгрдп


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


рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╕рдорд╛рдзрд╛рди рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдкрд░ рдХреИрд╕реЗ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред


рдЪрд╛рд▓


рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реЗрдЯ рдкреЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд╛рд░реНрд╢рдирд┐рдХ рд╡реЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореИрдВ рди рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╕реЗрдЯ (рдпрд╛рдиреА take_t , taken_t , busy_t , put_t ) рдХреЛ рдмрдЪрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдореИрдВ рдпрд╣ рднреА рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рднреА рдЙрд╕реА рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдерд╛: рдЕрднрд┐рдиреЗрддрд╛-рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рдПрдХрдорд╛рддреНрд░ рдЕрднрд┐рдиреЗрддрд╛-рд╡реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рд╕рдВрд╡рд╛рдж рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕реЛрдЪрд╛ рдХрд┐ рд╡рд╣ рд╕реАрдзреЗ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ-рдХрд╛рдВрдЯреЗ (рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓реЗ рдЧрдП рд╣реИрдВ) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИред


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рд╕рд░рд▓ рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рдПрдХ рдЕрднрд┐рдиреЗрддрд╛-рд╡реЗрдЯрд░ mbox-s рдХрд╛ рдПрдХ рд╕реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рд▓рд┐рдВрдХ рдЬреЛ рджрд╛рд░реНрд╢рдирд┐рдХ-рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЛ рдХрд╛рдВрдЯрд╛ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ mbox-s рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЕрднрд┐рдиреЗрддрд╛-рд╡реЗрдЯрд░ рдЗрди рд╕рднреА рдореЛрдХреНрд╕ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ (рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ SObjectizer рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ SObjectizer рди рдХреЗрд╡рд▓ / рдЬреИрд╕рд╛ рдХрд┐ рдХрдИ рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рдореЙрдбрд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд▓реЗрдХрд┐рди Pub / Sub рднреА "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рд╕рдорд░реНрдерд┐рдд рд╣реИ) ред


рдХреЛрдб рдореЗрдВ, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 class waiter_t final : public so_5::agent_t { public : waiter_t( context_t ctx, std::size_t forks_count ) : so_5::agent_t{ std::move(ctx) } , m_fork_states( forks_count, fork_state_t::free ) { //  mbox-   "" m_fork_mboxes.reserve( forks_count ); for( std::size_t i{}; i != forks_count; ++i ) m_fork_mboxes.push_back( so_environment().create_mbox() ); } ... void so_define_agent() override { //      "". for( std::size_t i{}; i != m_fork_mboxes.size(); ++i ) { //     .   . //          //    . so_subscribe( fork_mbox( i ) ) .event( [i, this]( mhood_t<take_t> cmd ) { on_take_fork( std::move(cmd), i ); } ) .event( [i, this]( mhood_t<put_t> cmd ) { on_put_fork( std::move(cmd), i ); } ); } } private : ... //     "". std::vector< so_5::mbox_t > m_fork_mboxes; 

рдпрд╛рдиреА рдкрд╣рд▓реЗ, рдЧреИрд░-рдореМрдЬреВрдж "рдХрд╛рдВрдЯреЗ" рдХреЗ рд▓рд┐рдП рдПрдордмреЙрдХреНрд╕-рдПрд╕ рдХрд╛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛рдПрдВ, рдлрд┐рд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдВред рд╣рд╛рдВ, рд╣рдо рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреБрд░реЛрдз рдХрд┐рд╕ рд╡рд┐рд╢реЗрд╖ рдкреНрд▓рдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред


on_take_fork() рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВрдбрд▓рд░ on_take_fork() рд╡рд┐рдзрд┐ рд╣реИ:


 void on_take_fork( mhood_t<take_t> cmd, std::size_t fork_index ) { //   ,       //    . if( fork_index == cmd->m_philosopher_index ) handle_take_left_fork( std::move(cmd), fork_index ); else handle_take_right_fork( std::move(cmd), fork_index ); } 

рд╡реИрд╕реЗ, рдпрд╣ рдпрд╣рд╛рдБ рдерд╛ рдХрд┐ рд╣рдореЗрдВ take_t рд╕рдВрджреЗрд╢ рд╕реЗ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред


рддреЛ, on_take_fork() рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореВрд▓ рдЕрдиреБрд░реЛрдз рдФрд░ рдХрд╛рдВрдЯреЗ рдХрд╛ рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЕрдиреБрд░реЛрдз рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ рдПрдХ рдмрд╛рдПрдВ рдХрд╛рдВрдЯрд╛ рдпрд╛ рдПрдХ рд╕рд╣реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реИред рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдФрд░ рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛)ред


рдЪреВрдВрдХрд┐ рджрд╛рд░реНрд╢рдирд┐рдХ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдмрд╛рдПрдВ рдХрд╛рдВрдЯрд╛ рдорд╛рдВрдЧрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рд╕рдордп рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЦреБрдж рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


  1. рджреЛрдиреЛрдВ рдХрд╛рдВрдЯреЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВ рдФрд░ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рджрд╛рд░реНрд╢рдирд┐рдХ taken_t , рдФрд░ рд╕рд╣реА рдХрд╛рдВрдЯреЗ рдХреЛ рдЖрд░рдХреНрд╖рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреЛрдИ рдФрд░ рдЗрд╕реЗ рди рд▓реЗ рд╕рдХреЗред
  2. рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рдХрд╛рдВрдЯреЗ рдирд╣реАрдВ рджрд┐рдП рдЬрд╛ рд╕рдХрддреЗред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХреНрдпреЛрдВред рд╢рд╛рдпрдж рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЕрднреА рд╡реНрдпрд╕реНрдд рд╣реИрдВред рдпрд╛ рд▓рд╛рдЗрди рдореЗрдВ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рдкрдбрд╝реЛрд╕рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╡реИрд╕реЗ рднреА, рд╣рдордиреЗ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рд╡рд╛рд▓реЗ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдЦрдбрд╝рд╛ рдХрд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЙрд╕реЗ busy_t ред

рдХрд╛рдо рдХреЗ рдЗрд╕ рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рджрд╛рд░реНрд╢рдирд┐рдХ рдЬреЛ рдмрд╛рдПрдВ рдХрд╛рдВрдЯреЗ рдХреЗ рд▓рд┐рдП taken_t рдкреНрд░рд╛рдкреНрдд taken_t рд╣реИ, рд╡рд╣ рд╕рд╣реА рдХрд╛рдВрдЯреЗ рдХреЗ рд▓рд┐рдП take_t рдЕрдиреБрд░реЛрдз рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреБрд░реЛрдз рддреБрд░рдВрдд рд╕рдВрддреБрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдХрд╛рдВрдЯрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рджрд╛рд░реНрд╢рдирд┐рдХ рдХреЗ рд▓рд┐рдП рдЖрд░рдХреНрд╖рд┐рдд рд╣реИред


рдкрд░рд┐рдгрд╛рдо


рдпрджрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдореА рд╕рдорд╛рдзрд╛рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:


  Socrates: tttttttttttL....EEEEEEEEEEEEEEttttttttttL...L...EEEEEEEEEEEEEtttttL. Plato: tttttttttttL....L..L..L...L...EEEEEEEEEEEEEtttttL.....L....L.....EEE Aristotle: tttttttttL.....EEEEEEEEEttttttttttL.....L.....EEEEEEEEEEEtttL....LL Descartes: ttEEEEEEEEEEtttttttL.L..EEEEEEEEEEEEtttL..L....L....L.....EEEEEEEEEE Spinoza: tttttttttL.....EEEEEEEEEttttttttttL.....L.....EEEEEEEEEEEtttL....LL Kant: ttEEEEEEEEEEEEEtttttttL...L.....L.....EEEEEttttL....L...L..L...EEEEE Schopenhauer: ttttL...L.....L.EEEEEEEEEEEEEEEEEtttttttttttL..L...L..EEEEEEEttttttt Nietzsche: tttttttttttL....L..L..L...L...L.....L....EEEEEEEEEEEEttL.....L...L.. Wittgenstein: tttttttttL....L...L....L....L...EEEEEEEttttL......L.....L.....EEEEEE Heidegger: ttttttL..L...L.....EEEEEEEEEEEEtttttL...L..L.....EEEEEEEEEEEttttttL. Sartre: ttEEEEEEEEEEEEEttttttttL.....L...EEEEEEEEEEEEttttttttttttL.....EEEEE 

рдЖрдк рдкрд╛рддреНрд░реЛрдВ R рдХреА рдХрдореА рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ R рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рдлрд▓ рдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛рдПрдБ рдПрдХ рд╕рд╣реА рдХрд╛рдВрдЯреЗ рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред


рдордзреНрдпрд╕реНрде (рд╡реЗрдЯрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдФрд░ рдирд┐рд░реНрдгрдп


рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдкрд┐рдЫрд▓реЗ waiter_with_queue рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВ:


  Socrates: tttttEEEEEEEEEEEEEEtttL.....LL...L....EEEEEEEEEttttttttttL....L.....EE Plato: tttttL..L..L....LL...EEEEEEEEEEEEEEEttttttttttttL.....EEEEEEEEEttttttt Aristotle: tttttttttttL..L...L.....L.....L....L.....EEEEEEEEEEEEtttttttttttL....L.. Descartes: ttttttttttEEEEEEEEEEttttttL.....L....L..L.....L.....L..L...L..EEEEEEEEtt Spinoza: tttttttttttL..L...L.....L.....L....L.....L..L..L....EEEEEEEEEEtttttttttt Kant: tttttttttL....L....L...L...L....L..L...EEEEEEEEEEEttttttttttL...L......E Schopenhauer: ttttttL....L..L...L...LL...L...EEEEEtttttL....L...L.....EEEEEEEEEttttt Nietzsche: tttttL..L..L....EEEEEEEEEEEEEttttttttttttEEEEEEEEEEEEEEEttttttttttttL... Wittgenstein: tttEEEEEEEEEEEEtttL....L....L..EEEEEEEEEtttttL..L..L....EEEEEEEEEEEEEEEE Heidegger: tttttttttL...L..EEEEEEEEttttL..L.....L...EEEEEEEEEtttL.L..L...L....L...L Sartre: ttttttttttL..L....L...L.EEEEEEEEEEEtttttL...L..L....EEEEEEEEEEtttttttttt 

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


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


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


рд╣рдо рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдХреЛрдб рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА "рдХрд╛рдВрдЯреЗ" рдХреЗ рд▓рд┐рдП mboxes рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЪрд╛рд▓ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрд╛рддрдЪреАрдд рдореЗрдВ waiter_with_queue рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдереАред


рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рд╡рд░рдг рдЬреЛ рдореИрдВ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛


рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХрдИ рд╡рд┐рд╡рд░рдг рд╣реИрдВ, рдЬрд┐рди рдкрд░ рдореИрдВ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╡рд┐рд╡рд░рдг SObjectizer рдХреА рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред


рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд╛ рд╕рдВрджрд░реНрдн


fork_t рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╕рднреА рдореБрдЦреНрдп рдЕрднрд┐рдиреЗрддрд╛рдУрдВ ( fork_t , philosopher_t , waiter_t ) рдиреЗ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╕реВрддреНрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ред рдЬрд┐рд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ SObjectizer рдореЗрдВ рд╕рднреА рдХрд▓рд╛рдХрд╛рд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред SObjectizer рдореЗрдВ, рдЖрдк рдЕрднрд┐рдиреЗрддрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдореЗрдВ рдмрд╛рдБрдз рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, no_waiter_simple рд╕рдорд╛рдзрд╛рди рдореЗрдВ run_simulation() рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдХреЛрдб рдореЗрдВред


No_waiter_simple рд╕реЗ Run_simulation рдХреЛрдб
 void run_simulation( so_5::environment_t & env, const names_holder_t & names ) { env.introduce_coop( [&]( so_5::coop_t & coop ) { coop.make_agent_with_binder< trace_maker_t >( so_5::disp::one_thread::create_private_disp( env )->binder(), names, random_pause_generator_t::trace_step() ); coop.make_agent_with_binder< completion_watcher_t >( so_5::disp::one_thread::create_private_disp( env )->binder(), names ); const auto count = names.size(); std::vector< so_5::agent_t * > forks( count, nullptr ); for( std::size_t i{}; i != count; ++i ) forks[ i ] = coop.make_agent< fork_t >(); for( std::size_t i{}; i != count; ++i ) coop.make_agent< philosopher_t >( i, forks[ i ]->so_direct_mbox(), forks[ (i + 1) % count ]->so_direct_mbox(), default_meals_count ); }); } 

рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, trace_maker_t рдФрд░ trace_maker_t рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд▓рд╛рдХрд╛рд░ completion_watcher_t ред рд╡реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рдо рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, one_thread рдкреНрд░рдХрд╛рд░ рдХреЗ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг one_thread рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЕрднрд┐рдиреЗрддрд╛ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдмрдВрдзреЗ рд╣реЛрддреЗ рд╣реИрдВред рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпреЗ рдХрд▓рд╛рдХрд╛рд░ рд╕рдХреНрд░рд┐рдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ: рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдп рд╕реВрддреНрд░ рд╣реЛрдЧрд╛ред


SObjectizer рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЙрдХреНрд╕ рдХреЗ рдареАрдХ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреЗрд╡рд▓рдкрд░ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдбреЗрд╡рд▓рдкрд░ рдХреА рдЬрд░реВрд░рдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбрд┐рд╕реНрдкреИрдЪрд░ рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред


, , . , fork_t , philosopher_t .


run_simulation no_waiter_simple_tp
 void run_simulation( so_5::environment_t & env, const names_holder_t & names ) { env.introduce_coop( [&]( so_5::coop_t & coop ) { coop.make_agent_with_binder< trace_maker_t >( so_5::disp::one_thread::create_private_disp( env )->binder(), names, random_pause_generator_t::trace_step() ); coop.make_agent_with_binder< completion_watcher_t >( so_5::disp::one_thread::create_private_disp( env )->binder(), names ); const auto count = names.size(); //     thread_pool-. so_5::disp::thread_pool::bind_params_t bind_params; bind_params.fifo( so_5::disp::thread_pool::fifo_t::individual ); std::vector< so_5::agent_t * > forks( count, nullptr ); //     -. auto fork_disp = so_5::disp::thread_pool::create_private_disp( env, 3u //  . ); for( std::size_t i{}; i != count; ++i ) //      . forks[ i ] = coop.make_agent_with_binder< fork_t >( fork_disp->binder( bind_params ) ); //     -. auto philosopher_disp = so_5::disp::thread_pool::create_private_disp( env, 6u //  . ); for( std::size_t i{}; i != count; ++i ) coop.make_agent_with_binder< philosopher_t >( philosopher_disp->binder( bind_params ), i, forks[ i ]->so_direct_mbox(), forks[ (i + 1) % count ]->so_direct_mbox(), default_meals_count ); }); } 

fork_t philosopher_t .



Modern dining philosophers , , :


 void doEat() { eventLog_.startActivity(ActivityType::eat); wait(randBetween(10, 50)); eventLog_.endActivity(ActivityType::eat); 

SObjectizer . , , . рдХрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ?


, SObjectizer- : . agent_state_listener_t . , SObjectizer .


greedy_philosopher_t philosopher_t :


 philosopher_t(...) ... { so_add_destroyable_listener( state_watcher_t::make( so_environment(), index ) ); } 

state_watcher_t тАФ .


state_watcher_t
 class state_watcher_t final : public so_5::agent_state_listener_t { const so_5::mbox_t m_mbox; const std::size_t m_index; state_watcher_t( so_5::mbox_t mbox, std::size_t index ); public : static auto make( so_5::environment_t & env, std::size_t index ) { return so_5::agent_state_listener_unique_ptr_t{ new state_watcher_t{ trace_maker_t::make_mbox(env), index } }; } void changed( so_5::agent_t &, const so_5::state_t & state ) override; }; 

state_watcher_t SObjectizer changed() . state_watcher_t::changed -.


state_watcher_t::changed
 void state_watcher_t::changed( so_5::agent_t &, const so_5::state_t & state ) { const auto detect_label = []( const std::string & name ) {...}; const char state_label = detect_label( state.query_name() ); if( '?' == state_label ) return; so_5::send< trace::state_changed_t >( m_mbox, m_index, state_label ); } 

CSP


, . (no_waiter_dijkstra, no_waiter_simple, waiter_with_timestamps) std::thread SObjectizer- mchain- (, , CSP- ). , , CSP- ( take_t , taken_t , busy_t , put_t ).


CSP- "" . , std::thread .



.



: + take_t put_t . fork_process :


 void fork_process( so_5::mchain_t fork_ch ) { //  :   . bool taken = false; //   . std::queue< so_5::mbox_t > wait_queue; //        . so_5::receive( so_5::from( fork_ch ), [&]( so_5::mhood_t<take_t> cmd ) { if( taken ) //  ,     . wait_queue.push( cmd->m_who ); else { //    . taken = true; so_5::send< taken_t >( cmd->m_who ); } }, [&]( so_5::mhood_t<put_t> ) { if( wait_queue.empty() ) taken = false; //     . else { //       . const auto who = wait_queue.front(); wait_queue.pop(); so_5::send< taken_t >( who ); } } ); } 

fork_process : , - .


fork_process тАФ "" , . receive() :


 so_5::receive( so_5::from( fork_ch ), [&]( so_5::mhood_t<take_t> cmd ) {...}, [&]( so_5::mhood_t<put_t> ) {...} ); 

SObjectizer- receive() . . . , . , .


-. fork_t . , , .



philosopher_process . , .


philosopher_process
 oid philosopher_process( trace_maker_t & tracer, so_5::mchain_t control_ch, std::size_t philosopher_index, so_5::mbox_t left_fork, so_5::mbox_t right_fork, int meals_count ) { int meals_eaten{ 0 }; random_pause_generator_t pause_generator; //         . auto self_ch = so_5::create_mchain( control_ch->environment() ); while( meals_eaten < meals_count ) { tracer.thinking_started( philosopher_index, thinking_type_t::normal ); //    . std::this_thread::sleep_for( pause_generator.think_pause( thinking_type_t::normal ) ); //    . tracer.take_left_attempt( philosopher_index ); so_5::send< take_t >( left_fork, self_ch->as_mbox(), philosopher_index ); //  ,  . so_5::receive( so_5::from( self_ch ).handle_n( 1u ), [&]( so_5::mhood_t<taken_t> ) { //   ,   . tracer.take_right_attempt( philosopher_index ); so_5::send< take_t >( right_fork, self_ch->as_mbox(), philosopher_index ); //  ,  . so_5::receive( so_5::from( self_ch ).handle_n( 1u ), [&]( so_5::mhood_t<taken_t> ) { //    .  . tracer.eating_started( philosopher_index ); //     . std::this_thread::sleep_for( pause_generator.eat_pause() ); //     . ++meals_eaten; //     . so_5::send< put_t >( right_fork ); } ); //     . so_5::send< put_t >( left_fork ); } ); } //   ,   . tracer.philosopher_done( philosopher_index ); so_5::send< philosopher_done_t >( control_ch, philosopher_index ); } 

:


 void philosopher_process( trace_maker_t & tracer, so_5::mchain_t control_ch, std::size_t philosopher_index, so_5::mbox_t left_fork, so_5::mbox_t right_fork, int meals_count ) 

.


SObjectizer- , , Actor-. :


 tracer.thinking_started( philosopher_index, thinking_type_t::normal ); 

tracer , .


control_ch , philosopher_done_t , , . .


left_fork right_fork . take_t put_t . , mbox_t mchain_t ?


! , . , mchain тАФ - mbox-, mchain- mbox_t .


, :


 int meals_eaten{ 0 }; random_pause_generator_t pause_generator; auto self_ch = so_5::create_mchain( control_ch->environment() ); 

тАФ self_ch . , .


. рдпрд╛рдиреА , .


, , this_thread::sleep_for .


, :


 so_5::send< take_t >( left_fork, self_ch->as_mbox(), philosopher_index ); 

take_t . mbox_t , self_ch mchain_t . as_mbox() .


receive() :


 so_5::receive( so_5::from( self_ch ).handle_n( 1u ), [&]( so_5::mhood_t<taken_t> ) {...} ); 

taken_t . . , .


- , philosopher_process . receive() :


 so_5::receive( so_5::from( self_ch ).handle_n( 1u ), [&]( so_5::mhood_t<taken_t> ) { ... so_5::receive( so_5::from( self_ch ).handle_n( 1u ), [&]( so_5::mhood_t<taken_t> ) {...} ); ... } ); 

- .



run_simulation() , . CSP- run_simulation() . , , ( ).


run_simulation
 void run_simulation( so_5::environment_t & env, const names_holder_t & names ) noexcept { const auto table_size = names.size(); const auto join_all = []( std::vector<std::thread> & threads ) { for( auto & t : threads ) t.join(); }; trace_maker_t tracer{ env, names, random_pause_generator_t::trace_step() }; //  . std::vector< so_5::mchain_t > fork_chains; std::vector< std::thread > fork_threads( table_size ); for( std::size_t i{}; i != table_size; ++i ) { //     . fork_chains.emplace_back( so_5::create_mchain(env) ); //     . fork_threads[ i ] = std::thread{ fork_process, fork_chains.back() }; } //      . auto control_ch = so_5::create_mchain( env ); //  . const auto philosopher_maker = [&](auto index, auto left_fork_idx, auto right_fork_idx) { return std::thread{ philosopher_process, std::ref(tracer), control_ch, index, fork_chains[ left_fork_idx ]->as_mbox(), fork_chains[ right_fork_idx ]->as_mbox(), default_meals_count }; }; std::vector< std::thread > philosopher_threads( table_size ); for( std::size_t i{}; i != table_size - 1u; ++i ) { //      . philosopher_threads[ i ] = philosopher_maker( i, i, i+1u ); } //        . philosopher_threads[ table_size - 1u ] = philosopher_maker( table_size - 1u, table_size - 1u, 0u ); //     . so_5::receive( so_5::from( control_ch ).handle_n( table_size ), [&names]( so_5::mhood_t<philosopher_done_t> cmd ) { fmt::print( "{}: done\n", names[ cmd->m_philosopher_index ] ); } ); //     . join_all( philosopher_threads ); //     . for( auto & ch : fork_chains ) so_5::close_drop_content( ch ); //       . join_all( fork_threads ); //  . tracer.done(); //   SObjectizer. env.stop(); } 

, run_simulation() - . .


. :


 std::vector< so_5::mchain_t > fork_chains; std::vector< std::thread > fork_threads( table_size ); for( std::size_t i{}; i != table_size; ++i ) { fork_chains.emplace_back( so_5::create_mchain(env) ); fork_threads[ i ] = std::thread{ fork_process, fork_chains.back() }; } 

, , . . , join .


, .. join :


 std::vector< std::thread > philosopher_threads( table_size ); for( std::size_t i{}; i != table_size - 1u; ++i ) { philosopher_threads[ i ] = philosopher_maker( i, i, i+1u ); } philosopher_threads[ table_size - 1u ] = philosopher_maker( table_size - 1u, table_size - 1u, 0u ); 

. :


 so_5::receive( so_5::from( control_ch ).handle_n( table_size ), [&names]( so_5::mhood_t<philosopher_done_t> cmd ) { fmt::print( "{}: done\n", names[ cmd->m_philosopher_index ] ); } ); 

receive() table_size philosopher_done_t .


philosopher_done_t .


join :


 join_all( philosopher_threads ); 

join . join , .. . receive() . join :


 for( auto & ch : fork_chains ) so_5::close_drop_content( ch ); join_all( fork_threads ); 

.


noexcept


, run_simulation , noexcept . , exception-safety . тАФ .


run_simulation ?


, . - exception-safety , . - , :


 try { for( std::size_t i{}; i != table_size; ++i ) { fork_chains.emplace_back( so_5::create_mchain(env) ); fork_threads[ i ] = std::thread{ fork_process, fork_chains.back() }; } } catch( ... ) { for( std::size_t i{}; i != fork_chains.size(); ++i ) { so_5::close_drop_content( fork_chains[ i ] ); if( fork_threads[ i ].joinable() ) fork_threads[ i ].join(); } throw; } 

, . рдХреНрдпреЛрдВрдХрд┐ , . - :


 struct fork_threads_stuff_t { std::vector< so_5::mchain_t > m_fork_chains; std::vector< std::thread > m_fork_threads; fork_threads_stuff_t( std::size_t table_size ) : m_fork_threads( table_size ) {} ~fork_threads_stuff_t() { for( std::size_t i{}; i != m_fork_chains.size(); ++i ) { so_5::close_drop_content( m_fork_chains[ i ] ); if( m_fork_threads[ i ].joinable() ) m_fork_threads[ i ].join(); } } void run() { for( std::size_t i{}; i != m_fork_threads.size(); ++i ) { m_fork_chains.emplace_back( so_5::create_mchain(env) ); m_fork_threads[ i ] = std::thread{ fork_process, m_fork_chains.back() }; } } } fork_threads_stuff{ table_size }; //   . fork_threads_stuff.run(); //     . //       fork_threads_stuff. 

, (, Boost- ScopeExit-, GSL- finally() ).


. .


, exception-safety run_simulation() , run_simulation() , . , -. exception-safety run_simulation() noexcept , std::terminate . , .


, , , , . , join , join . .


()


, CSP- , .


.



fork_process , :


 void fork_process( so_5::mchain_t fork_ch ) { //  :   . bool taken = false; //      . so_5::receive( so_5::from( fork_ch ), [&]( so_5::mhood_t<take_t> cmd ) { if( taken ) so_5::send< busy_t >( cmd->m_who ); else { taken = true; so_5::send< taken_t >( cmd->m_who ); } }, [&]( so_5::mhood_t<put_t> ) { if( taken ) taken = false; } ); } 

, fork_process , ( , ).



philosopher_process , , .


philosopher_process
 void philosopher_process( trace_maker_t & tracer, so_5::mchain_t control_ch, std::size_t philosopher_index, so_5::mbox_t left_fork, so_5::mbox_t right_fork, int meals_count ) { int meals_eaten{ 0 }; //       . thinking_type_t thinking_type{ thinking_type_t::normal }; random_pause_generator_t pause_generator; //      . auto self_ch = so_5::create_mchain( control_ch->environment() ); while( meals_eaten < meals_count ) { tracer.thinking_started( philosopher_index, thinking_type ); //    . std::this_thread::sleep_for( pause_generator.think_pause( thinking_type ) ); //  ,     . thinking_type = thinking_type_t::hungry; //    . tracer.take_left_attempt( philosopher_index ); so_5::send< take_t >( left_fork, self_ch->as_mbox(), philosopher_index ); //  ,  . so_5::receive( so_5::from( self_ch ).handle_n( 1u ), []( so_5::mhood_t<busy_t> ) { /*     */ }, [&]( so_5::mhood_t<taken_t> ) { //   ,   . tracer.take_right_attempt( philosopher_index ); so_5::send< take_t >( right_fork, self_ch->as_mbox(), philosopher_index ); //  ,  . so_5::receive( so_5::from( self_ch ).handle_n( 1u ), []( so_5::mhood_t<busy_t> ) { /*     */ }, [&]( so_5::mhood_t<taken_t> ) { //    ,  . tracer.eating_started( philosopher_index ); //     . std::this_thread::sleep_for( pause_generator.eat_pause() ); //     . ++meals_eaten; //      . so_5::send< put_t >( right_fork ); //        "normal". thinking_type = thinking_type_t::normal; } ); //       . so_5::send< put_t >( left_fork ); } ); } //    . tracer.philosopher_done( philosopher_index ); so_5::send< philosopher_done_t >( control_ch, philosopher_index ); } 

- philosopher_process philosopher_process . .


-, thinking_type . , , , "" .


-, busy_t . receive() :


 so_5::receive( so_5::from( self_ch ).handle_n( 1u ), []( so_5::mhood_t<busy_t> ) { /*     */ }, [&]( so_5::mhood_t<taken_t> ) { ... so_5::receive( so_5::from( self_ch ).handle_n( 1u ), []( so_5::mhood_t<busy_t> ) { /*     */ }, [&]( so_5::mhood_t<taken_t> ) {...} ); 

, busy_t , , receive() , receive() . busy_t . , .. receive() busy_t . receive() busy_t .



CSP- , . (): waiter_with_queue, , waiter_with_timestamps. : mbox- , mbox- , mbox- .


CSP- , philosopher_process no_waiter_simple. mchain- , ?


, .


mchain- . , mchain-.


SObjectizer- select() , , , :


 so_5::select( so_5::from_all(), case_(ch1, one_handler_1, one_handler_2, one_handler_3, ...), case_(ch2, two_handler_1, two_handler_2, two_handler_3, ...), ...); 

select() , -. " " . CSP- .


.


, , take_t put_t . - . take_t put_t , :


 struct extended_take_t final : public so_5::message_t { const so_5::mbox_t m_who; const std::size_t m_philosopher_index; const std::size_t m_fork_index; extended_take_t( so_5::mbox_t who, std::size_t philosopher_index, std::size_t fork_index ) : m_who{ std::move(who) } , m_philosopher_index{ philosopher_index } , m_fork_index{ fork_index } {} }; struct extended_put_t final : public so_5::message_t { const std::size_t m_fork_index; extended_put_t( std::size_t fork_index ) : m_fork_index{ fork_index } {} }; 

, so_5::message_t , ( ). , SObjectizer- .

, . take_t put_t , extended_take_t extended_put_t , .


mbox. :)


mbox-
 class wrapping_mbox_t final : public so_5::extra::mboxes::proxy::simple_t { using base_type_t = so_5::extra::mboxes::proxy::simple_t; //    . const so_5::mbox_t m_target; //  ,      . const std::size_t m_fork_index; //    . static std::type_index original_take_type; static std::type_index original_put_type; public : wrapping_mbox_t( const so_5::mbox_t & target, std::size_t fork_index ) : base_type_t{ target } , m_target{ target } , m_fork_index{ fork_index } {} //    so_5::abstract_message_box_t   . //       . void do_deliver_message( const std::type_index & msg_type, const so_5::message_ref_t & message, unsigned int overlimit_reaction_deep ) const override { if( original_take_type == msg_type ) { //     . const auto & original_msg = so_5::message_payload_type<::take_t>:: payload_reference( *message ); //     . so_5::send< extended_take_t >( m_target, original_msg.m_who, original_msg.m_philosopher_index, m_fork_index ); } else if( original_put_type == msg_type ) { //     . so_5::send< extended_put_t >( m_target, m_fork_index ); } else base_type_t::do_deliver_message( msg_type, message, overlimit_reaction_deep ); } //       wrapping_mbox_t. static auto make( const so_5::mbox_t & target, std::size_t fork_index ) { return so_5::mbox_t{ new wrapping_mbox_t{ target, fork_index } }; } }; std::type_index wrapping_mbox_t::original_take_type{ typeid(::take_t) }; std::type_index wrapping_mbox_t::original_put_type{ typeid(::put_t) }; 

mbox-: so_5_extra , . so_5::abstract_message_box_t .


, wrapping_mbox_t . , . wrapping_mbox, mchain . waiter_process , , :


 void waiter_process( so_5::mchain_t waiter_ch, details::waiter_logic_t & logic ) { //        . so_5::receive( so_5::from( waiter_ch ), [&]( so_5::mhood_t<details::extended_take_t> cmd ) { logic.on_take_fork( std::move(cmd) ); }, [&]( so_5::mhood_t<details::extended_put_t> cmd ) { logic.on_put_fork( std::move(cmd) ); } ); } 

, , . waiter_with_timestamps .


: " philosopher_process mbox-?" , waiter_with_timestamps mbox, mchain.


, mchain. , .. so_5_extra mchain- ( ). mbox- mchain-.


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


, , , CSP . , . , , . , - .


, SObjectizer-. , "" SObjectizer тАФ 5.6, 5.5. , ( ). - , SO-5.6 ( ).


, !


рдкреБрдирд╢реНрдЪред "" , . C++14.

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


All Articles