рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред рднрд╛рдЧ 2 - рдЪреИрд▓реЗрдВрдЬрд░реНрд╕

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╡рд╛рд▓рд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рдпрд╣рд╛рдВ рд╣реИ ред

рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд╛рд╡рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рд╡рд░реНрдгрд╛рдиреБрдХреНрд░рдо рдореЗрдВ - рд╕рдХреНрд░рд┐рдп рдУрдмреЗрд░реЙрди, рдПрдбрд╛, рдмреЗрдЯрд░, рдЖрдИрдИрд╕реА 61131-3 рдПрд╕рдЯреА, рд╕реЗрдл-рд╕реАред

рдПрдХ рдмрд╛рд░, рдЕрд╕реНрд╡реАрдХрд░рдг (рдмрд╣рд╛рдирд╛) рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ "рд╕рднреА рдмрд╛рдИрдВ рдУрд░" рдЕрднрд┐рдпрд╛рди, рдФрд░ рд╕рдореАрдХреНрд╖рд╛ рдмрд▓реНрдХрд┐ рдЕрдХрд╛рджрдорд┐рдХ рд╣реИ - рднрд╛рд╖рд╛ рдореЗрдВ рди рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерд┐рдд рдЖрдзреБрдирд┐рдХ рд╡рд┐рдХрд╛рд╕ рдкрд░рд┐рд╡реЗрд╢ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рдордВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХрд▓рдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

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

рд╕рдХреНрд░рд┐рдп рдУрдмреЗрд░реЙрди (2004)


рдпрд╣ 1988 рдХреЗ рдмрд╛рдж рд╕реЗ рдкрд╛рд╕реНрдХрд▓, рдореЛрдбреБрд▓рд╛, рдкрд┐рдЫрд▓реЗ рдУрдмреЗрд░реЛрди рдХреЗ рдЕрдиреБрднрд╡, рдЬрд╛рд╡рд╛, рд╕реА #, рдПрдбрд╛ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЖрд╡реЗрджрди рдореЗрдВ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрднрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрдЦ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдореЗрдВ OS A2 рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЬреЛ * nix рдпрд╛ Windows рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕реНрд░реЛрдд A2 рдФрд░ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ ред

рдУрдмреЗрд░реЛрди 2 рд╕реЗ рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ (рдУрдУрд╕реА) рдкрд░рд┐рдпреЛрдЬрдирд╛ рднреА рд╣реИ рдЬреЛ рдУрдмреЗрд░реЙрди рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рдЬреБрдбрд╝реА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдереЛрдбрд╝реА рдЕрд▓рдЧ рдмреЛрд▓реА рд╣реИ, рдорддрднреЗрдж рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред

рдУрдмреЗрд░реЙрди рдХреА рдкреНрд░рдореБрдЦ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреА рдЕрд╕рд╛рдзрд╛рд░рдг рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рд╣реИред рдпреЗ рдмреЗрд╕ рдУрдмреЗрд░реЙрди -2 рдкреНрд▓рд╕ 23 рдкреЗрдЬ рдкрд░ рдорд▓реНрдЯреА рдереНрд░реЗрдбреЗрдб рдПрдХреНрдЯрд┐рд╡ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкрд░ 16 рдкреЗрдЬ рд╣реИрдВред

рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИред

рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рд╣реЛрддреЗ рд╣реИрдВред

рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ (рдЬреАрд╕реА) рдХреЗ рд╕рд╛рде рдвреЗрд░ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдУрдУрдкреАред

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

рдзрд╛рд░рд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЙрдЪреНрдЪ / рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рд╡реЗ рдЬреАрд╕реА рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред UTF-8 рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ред

рд░рдирдЯрд╛рдЗрдо (рдУрдмреЗрд░реЙрди рд╕рд┐рд╕реНрдЯрдо) рдПрдХ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╡рд┐рдлрд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдореЙрдбреНрдпреВрд▓ / рдереНрд░реЗрдб рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕рд┐рдВрдЧ, рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрдгрд╛рдВрдХ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ред

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

рдУрдмреЗрд░реЙрди -2 рдУрдУрд╕реА


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

рдореЙрдбреНрдпреВрд▓ 3


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

рд╕рдХреНрд░рд┐рдп рдУрдмреЗрд░реЙрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЬреЗрдиреЗрд░рд┐рдХ рдФрд░ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпреВрдирд┐рдХреЛрдб, рдЬреАрдпреВрдЖрдИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреЛрд╕реНрдЯрдЧреНрд░реЗрдб рдХреЗ рд╕рд╛рде рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВред рд╕реАред рдХреЗ рд╕рд╛рде рд╕рд░рд▓реАрдХреГрдд рдПрдХреАрдХрд░рдгред RAII рдЬреИрд╕рд╛ (C # рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди)ред

рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 2010 рдореЗрдВ рдореЛрдбреБрд▓рд╛ 3 рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд░реБрдХ рдЧрдпрд╛ред

рдЕрд╕реНрд╡реАрдХрд░рдгред WinAOS рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдмреНрд▓реВ рд╕реЗ рдмрд╛рд╣рд░ TRAPs (рдЙрд░реНрдл рдПрдмреЙрд░реНрдЯ / рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдпрд╛ рд░рдирдЯрд╛рдЗрдо рдПрд░рд░) рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЯрд╛рд╕реНрдХ рдореИрдиреЗрдЬрд░ рдиреЗ рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛, рдФрд░ рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рд┐рд╕реНрдЯрдо / рд░рдирдЯрд╛рдЗрдо рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реБрдЖ - рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрджреЗрд╣ рдерд╛ рдХрд┐ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ = (

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдУрд╕реА рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЖрддреНрдо-рдирд┐рд╣рд┐рдд рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рдеред

рднреЛрдЬрди рдХреЗ рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд
MODULE Philo; (* Dining Philosophers Example from Active Oberon Language Report by Patrik Reali *) (* Adapted for running in AOS by Siemargl *) IMPORT Semaphores := Example8, Out; CONST NofPhilo = 5; (* number of philosophers *) VAR fork: ARRAY NofPhilo OF Semaphores.Semaphore; i: LONGINT; TYPE Philosopher = OBJECT VAR first, second: LONGINT; (* forks used by this philosopher *) PROCEDURE & Init(id: LONGINT); BEGIN IF id # NofPhilo-1 THEN first := id; second := (id+1) ELSE first := 0; second := NofPhilo-1 END END Init; PROCEDURE Think; (* Need lock console output *) BEGIN {EXCLUSIVE} Out.Int(first); Out.String(".... Think...."); Out.Ln; END Think; PROCEDURE Eat; BEGIN {EXCLUSIVE} Out.Int(first); Out.String(".... Eat...."); Out.Ln; END Eat; BEGIN {ACTIVE} LOOP Think; fork[first].P; fork[second].P; Eat; fork[first].V; fork[second].V END END Philosopher; VAR philo: ARRAY NofPhilo OF Philosopher; BEGIN FOR i := 0 TO NofPhilo DO NEW(fork[i], INTEGER(i)); NEW(philo[i], i); END; END Philo. Philo.Philo1 ~ 

рдЕрджрд╛ (1980, рдЕрдВрддрд┐рдо рд╡реИрдз 2016 рдорд╛рдирдХ)


рджрд░рдЕрд╕рд▓, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ред

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдЕрдбрд╛ рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП рд▓рд╛рдирдд рдХреА рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рдЗрд╕реЗ рдореБрд╢реНрдХрд┐рд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмреБрд▓рд╛рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред)

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - GNUTaya Ada , рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, ISO / IEC рдорд╛рдирдХреАрдХреГрдд рд╣реИред

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

Ada Reference Manual 2012 рдореЗрдВ 950 рдкреЗрдЬ рд╣реИрдВред

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

Ada-ru рд╕рд╛рдЗрдЯ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдореАрдХреНрд╖рд╛ рдЕрдиреБрд╡рд╛рдж рд▓реЗрдЦ рд╣реИ - рдкрд╣рд▓рд╛ рд▓рд┐рдВрдХред

рднреЛрдЬрди рдХреЗ рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд
 -- Code from https://rosettacode.org/wiki/Dining_philosophers#Ordered_mutexes -- ADA95 compatible so can run in ideone.com with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random; with Ada.Text_IO; use Ada.Text_IO; procedure Test_Dining_Philosophers is type Philosopher is (Aristotle, Kant, Spinoza, Marx, Russel); protected type Fork is entry Grab; procedure Put_Down; private Seized : Boolean := False; end Fork; protected body Fork is entry Grab when not Seized is begin Seized := True; end Grab; procedure Put_Down is begin Seized := False; end Put_Down; end Fork; Life_Span : constant := 20; -- In his life a philosopher eats 20 times task type Person (ID : Philosopher; First, Second : not null access Fork); task body Person is Dice : Generator; begin Reset (Dice); for Life_Cycle in 1..Life_Span loop Put_Line (Philosopher'Image (ID) & " is thinking"); delay Duration (Random (Dice) * 0.100); Put_Line (Philosopher'Image (ID) & " is hungry"); First.Grab; Second.Grab; Put_Line (Philosopher'Image (ID) & " is eating"); delay Duration (Random (Dice) * 0.100); Second.Put_Down; First.Put_Down; end loop; Put_Line (Philosopher'Image (ID) & " is leaving"); end Person; Forks : array (1..5) of aliased Fork; -- Forks for hungry philosophers -- Start philosophers Ph_1 : Person (Aristotle, Forks (1)'Access, Forks (2)'Access); Ph_2 : Person (Kant, Forks (2)'Access, Forks (3)'Access); Ph_3 : Person (Spinoza, Forks (3)'Access, Forks (4)'Access); Ph_4 : Person (Marx, Forks (4)'Access, Forks (5)'Access); Ph_5 : Person (Russel, Forks (1)'Access, Forks (5)'Access); begin null; -- Nothing to do in the main task, just sit and behold end Test_Dining_Philosophers; 


рдмреЗрдЯрд░рдХ (dlang рд╕рдмрд╕реЗрдЯ 2017, рдореВрд▓ D - 2001, D 2.0 - 2007)


рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╕рдмрд╕реЗ рдЖрдзреБрдирд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рднрд╛рд╖рд╛ рдХрд╛ рдкреВрд░рд╛ рд╡рд┐рд╡рд░рдг рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ - 649 рдкреГрд╖реНрда - рдореВрд▓ рд╕рд╛рдЗрдЯ рджреЗрдЦреЗрдВ ред

рджрд░рдЕрд╕рд▓, рдпрд╣ рдбреА рд▓реИрдВрдЧреНрд╡реЗрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди-рдлрд╛рдЗрдЯрд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдмрдВрдз рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ!

рдХреНрдпреЛрдВрдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреА рдлреЛрдмреЛрд╕ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрд▓реЗрдХреНрдЬреЗрдВрдбреНрд░реЗрд╕реНрдХреБ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЪрд╛рд▓рд╛рдХ рд╣реИ, рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╡рд┐рд╖рдп рдХреА рдХреБрдВрдЬреА рдпрд╣ рд╣реИ рдХрд┐ рдлреЛрдмреЛрд╕ рд╕реНрдореГрддрд┐ рдХреА рдЦрдкрдд рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмреЗрдХрд╛рдмреВ рд╣реИред

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

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

рднрд╛рд╖рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рд╢рд╛рд╕рди рдХрд╛ рдФрдЪрд┐рддреНрдп ред

рдФрд░ рдлрд┐рд░ рдирд┐рдЪреЛрдбрд╝ - рдХреНрдпрд╛ рдХрдЯ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рд░рд╣рддрд╛ рд╣реИред

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

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

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

рднреЛрдЬрди рдХреЗ рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд
 // compile dmd -betterC import core.sys.windows.windows; import core.stdc.stdio; import core.stdc.stdlib : rand; //import std.typecons; // -impossible ( //import std.string; - impossible extern (Windows) alias btex_fptr = void function(void*) /*nothrow*/; //extern (C) uintptr_t _beginthreadex(void*, uint, btex_fptr, void*, uint, uint*) nothrow; /* Dining Philosophers example for a habr.com * by Siemargl, 2019 * BetterC variant. Compile >dmd -betterC Philo_BetterC.d */ extern (C) uintptr_t _beginthread(btex_fptr, uint stack_size, void *arglist) nothrow; alias HANDLE uintptr_t; alias HANDLE Fork; const philocount = 5; const cycles = 20; HANDLE[philocount] forks; struct Philosopher { const(char)* name; Fork left, right; HANDLE lifethread; } Philosopher[philocount] philos; extern (Windows) void PhilosopherLifeCycle(void* data) nothrow { Philosopher* philo = cast(Philosopher*)data; for (int age = 0; age++ < cycles;) { printf("%s is thinking\n", philo.name); Sleep(rand() % 100); printf("%s is hungry\n", philo.name); WaitForSingleObject(philo.left, INFINITE); WaitForSingleObject(philo.right, INFINITE); printf("%s is eating\n", philo.name); Sleep(rand() % 100); ReleaseMutex(philo.right); ReleaseMutex(philo.left); } printf("%s is leaving\n", philo.name); } extern (C) int main() { version(Windows){} else { static assert(false, "OS not supported"); } philos[0] = Philosopher ("Aristotlet".ptr, forks[0], forks[1], null); philos[1] = Philosopher ("Kant".ptr, forks[1], forks[2], null); philos[2] = Philosopher ("Spinoza".ptr, forks[2], forks[3], null); philos[3] = Philosopher ("Marx".ptr, forks[3], forks[4], null); philos[4] = Philosopher ("Russel".ptr, forks[0], forks[4], null); foreach(ref f; forks) { f = CreateMutex(null, false, null); assert(f); } foreach(ref ph; philos) { ph.lifethread = _beginthread(&PhilosopherLifeCycle, 0, &ph); assert(ph.lifethread); } foreach(ref ph; philos) WaitForSingleObject(ph.lifethread, INFINITE); // Close thread and mutex handles for( auto i = 0; i < philocount; i++ ) { CloseHandle(philos[i].lifethread); CloseHandle(forks[i]); } return 0; } 


рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рд╕реНрд░реЛрдд рдкреВрд░реНрдг рдбреА рд╣реИред

рд░реЛрд╕реЗрдЯ рдкрд░ рдЖрдк рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдк рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

IEC 61131-3 ST (1993, рдирд╡реАрдирддрдо рдорд╛рдирдХ 2013)


рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ред рдорд╛рдирдХ рдХрд╛ рдЕрд░реНрде рд╣реИ 5 рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдк, рд▓реЗрдХрд┐рди рд╕реАрдврд╝реА рддрд░реНрдХ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рд▓рд┐рдЦрдирд╛ рдЕрднреА рднреА рдПрдХ рд╕рд╛рд╣рд╕рд┐рдХ рдХрд╛рд░реНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рд╕рдВрд░рдЪрд┐рдд рдкрд╛рдаред
рдорд╛рдирдХ GOST R IEC 61131-3-2016 рдХрд╛ рдкрд╛рда - 230 рдкреГрд╖реНрдаред

рдкреАрд╕реА / x86 рдФрд░ рдПрдЖрд░рдПрдо рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ - рдФрд░ рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рд╡рд╛рд▓реЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз CODESYS рд╣реИ (рдЕрдХреНрд╕рд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдореЛрдВ рд╕реЗ рд╡рд╢реАрднреВрдд рднреА) рдФрд░ рдЦреБрд▓реЗ - рдмреЗрд░реАрдореАрдЬрд╝ - рд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╕рд╛рд░рд┐рддред

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

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╣рд╛рд▓ рд╣реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреА рд╣реИ - рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред

рдЯрд╛рдЗрдк рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдЬреНрдпрд╛рджрд╛рддрд░ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ (рдирд╡реАрдирддрдо рдорд╛рдирдХ рдореЗрдВ рдЖрд░рд╛рдо) рд╣реИред рд▓реЗрдХрд┐рди рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред

рдорд╛рдирдХ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, OOP рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдХрд╕реНрдЯрдо рд╣реИрдВрдбрд▓рд┐рдВрдЧ рд╣реИрдВрдбрд▓рд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдПрд░рд░ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИред

рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдирд╣реАрдВ рд╣реИред рдпрд╣ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╣реБрдЖ - рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рд╣рдореЗрд╢рд╛ рдКрдкрд░ рд╕реЗ рдирд┐рд░рдВрддрд░ рд╕реАрдорд┐рдд рд╣реЛрддреА рд╣реИред

рд╕реНрд░реЛрдд (рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ)
 (* Dining Philosophers example for a habr.com * by Siemargl, 2019 * ISO61131 ST language variant. Must be specialized 4 ur PLC * ) CONFIGURATION PLC_1 VAR_GLOBAL Forks : USINT; Philo_1: Philosopher; (* Instance block - static vars *) Philo_2: Philosopher; Philo_3: Philosopher; Philo_4: Philosopher; Philo_5: Philosopher; END_VAR RESOURCE Station_1 ON CPU_1 TASK Task_1 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_2 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_3 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_4 (INTERVAL := T#100MS, PRIORITY := 1); TASK Task_5 (INTERVAL := T#100MS, PRIORITY := 1); PROGRAM Life_1 WITH Task_1: Philo_1(Name := 'Kant', 0, 1, Forks); PROGRAM Life2 WITH Task_2: Philo_2(Name := 'Aristotel', 1, 2, Forks); PROGRAM Life3 WITH Task_3: Philo_3(Name := 'Spinoza', 2, 3, Forks); PROGRAM Life4 WITH Task_4: Philo_4(Name := 'Marx', 3, 4, Forks); PROGRAM Life5 WITH Task_5: Philo_5(Name := 'Russel', 4, 0, Forks); END_RESOURCE END_CONFIGURATION FUNCTION_BLOCK Philosopher; USING SysCpuHandling.library; VAR_INPUT Name: STRING; Left: UINT; Right: UINT; END_VAR VAR_IN_OUT Forks: USINT; END_VAR VAR Thinking: BOOL := TRUE; (* States *) Hungry: BOOL; Eating: BOOL; HaveLeftFork: BOOL; TmThink: TON; TmEating: TON; END_VAR TmThink(In := Thinking; PT := T#3s); TmEating(In := Eating; PT := T#5s); IF Thinking THEN (* Just waiting Timer *) Thinking := NOT TmThink.Q; Hungry := TmThink.Q; ELSIF Hungry (* Try Atomic Lock Forks *) IF HaveLeftFork IF SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Right, bSet := 1) = ERR_OK THEN Hungry := FALSE; Eating := TRUE; ELSE RETURN; END_IF ELSIF IF SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Left, bSet := 1) = ERR_OK THEN HaveLeftFork := TRUE; ELSE RETURN; END_IF END_IF ELSIF Eating (* Waiting Timer, then lay forks *) IF TmEating.Q THEN Thinking := TRUE; Eating := FALSE; HaveLeftFork := FALSE; SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Right, bSet := 0); SysCpuTestAndSetBit(Address := Forks, Len := 1, iBit := Left, bSet := 0); END_IF END_IF END_FUNCTION_BLOCK 


рд╕реЗрдл-рд╕реА (2011)


рдЦрддрд░рдирд╛рдХ рдЪрд┐рдкреНрд╕ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдкреНрд░рддрд┐рд░реВрдкрдХрддрд╛ рдФрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдпреЛрдЧрд┐рдХ рд╕реАред рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд▓
рд▓рдЧрднрдЧ 103 рдкреГрд╖реНрдареЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдгред рдпрджрд┐ рдЖрдк рд╕реА рд╕реЗ рдорддрднреЗрджреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ - рдмрд╣реБрдд рдХрдо, рд▓рдЧрднрдЧ 10 ред

рдПрд░реЗ рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдбрд╛рдпрдирд╛рдорд┐рдХ рдореЗрдореЛрд░реА рдСрдЯреЛрдореИрдЯрд┐рдХ рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде - рдбрдмрд▓ рд░рд┐рд▓реАрдЬ рдЪреЗрдХ рдФрд░ рдбреИрдВрдЧрд▓рд┐рдВрдЧ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рдеред

рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ GUI, рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ, рдиреЗрдЯрд╡рд░реНрдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ (рдПрдХ HTTP рд╕рд░реНрд╡рд░ рд╕рд╣рд┐рдд) рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдиреНрдпреВрдирддрдо рд╕реЗрдЯ рд╣реИред

рд▓реЗрдХрд┐рди - рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗрд╡рд▓ рд╡рд┐рдВрдбреЛрдЬ x86 рдХреЗ рд▓рд┐рдП рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛрдб рдЦреБрд▓рд╛ рд╣реИред

рдПрдХ рдЕрдиреНрдп рд╢реЛрдз рдХрд╛рд░реНрдп рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрд╛, рдЬреЛ IoT рд╕реЗрдВрд╕рд░ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ: рдПрдХ 75 Kb рдХрд╛рд░реНрдпрдХрд╛рд░реА рдореЙрдбреНрдпреВрд▓, рдФрд░ рдПрдХ <1 рдПрдордмреА рдЖрдВрд╢рд┐рдХ рдореЗрдореЛрд░реА рд╕реЗрдЯред

рднреЛрдЬрди рдХреЗ рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд
 /* Dining Philosophers example for a habr.com * by Siemargl, 2019 * Safe-C variant. Compile >mk.exe philosafec.c */ from std use console, thread, random; enum philos (ushort) { Aristotle, Kant, Spinoza, Marx, Russell, }; const int cycles = 10; const ushort NUM = 5; uint lived = NUM; packed struct philosopher // 32-bit { philos name; byte left, right; } philosopher philo_body[NUM]; SHARED_OBJECT forks[NUM]; void philosopher_life(philosopher philo) { int age; for (age = 0; age++ < cycles; ) { printf("%s is thinking\n", philo.name'string); delay((uint)rnd(1, 100)); printf("%s is hungry\n", philo.name'string); enter_shared_object(ref forks[philo.left]); enter_shared_object(ref forks[philo.right]); printf("%s is eating\n", philo.name'string); delay((uint)rnd(1, 100)); leave_shared_object(ref forks[philo.right]); leave_shared_object(ref forks[philo.left]); } printf("%s is leaving\n", philo.name'string); InterlockedExchange(ref lived, lived-1); } void main() { philos i; assert philosopher'size == 4; philo_body[0] = {Aristotle, 0, 1}; philo_body[1] = {Kant, 1, 2}; philo_body[2] = {Spinoza, 2, 3}; philo_body[3] = {Marx, 3, 4}; philo_body[4] = {Russell, 0, 4}; for (i = philos'first; i <= philos'last; i++) { assert run philosopher_life(philo_body[(uint)i]) == 0; } while (lived > 0) sleep 0; // until all dies for (i = philos'first; i <= philos'last; i++) { destroy_shared_object(ref forks[(uint)i]); } } 


рдЕрдВрдд рдореЗрдВ - рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛ ред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдореИрдВ рдХреБрдЫ рдпрд╛рдж рдХрд┐рдпрд╛ рдпрд╛ рдЧрд▓рдд рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА - рддреЛ рдЗрд╕реЗ рд╕рд╣реА рдХрд░реЗрдВред

рдЧрд┐рддреБрдм рдкрд░ рд▓реЗрдЦ рдХреЗ рд╕реНрд░реЛрдд ред

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


All Articles