рдЬрдм рдЖрдк рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЧрд▓рдд рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╕рд░рд▓ рд╣реИред рдкреВрд░рд╛ рд░реЛрдбрд╝рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕рдмрд╕реЗ рдЬрдЯрд┐рд▓ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рдмрд╕реЗ рдЧрд╣рд░реЗ рдХреЛрдиреЛрдВ рдореЗрдВ рдПрдХ рдЧрд▓рддреА рдХреА рддрд▓рд╛рд╢ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдпрд╣ рд╕рд┐рд░ рдореЗрдВ рднреА рдкреНрд░рд╡реЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕рд░рд▓ рдХреЛрдб, рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдзрд╛рд░, рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рд░реВрдкрд░реЗрдЦрд╛ред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдЙрди рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдБрдЧрд╛ рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдЕрднреНрдпрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛: рдПрдХ рдЕрдиреНрдп рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ред рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: C / C ++ред
рдПрдХ рдзрд╛рдЧрд╛ рд▓реЗрдВ, рдбрд░реЛ рдордд
рддреЛ, рд╕реНрдерд┐рддрд┐ рдкрд╣рд▓реЗ рд╣реИред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП : рдХрд╛рд░реНрдпрд╛рд▓рдп рдореЗрдВ рдХрд┐рд╕реА рдПрдХ рд▓реИрдкрдЯреЙрдк рдкрд░ (рдбреЗрд╡рд▓рдкрд░реНрд╕ рдирд╣реАрдВ), рдЬрдмрдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓ рд░рд╣рд╛ рдерд╛, рдПрдХ рдмрд┐рдВрджреБ рдкрд░
CreateThread () рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ
тАЬрдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ред рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рднрдВрдбрд╛рд░рдг рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред тАЭрдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЬрдм рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рддреЛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд▓рдХреНрд╖реНрдп рд▓реИрдкрдЯреЙрдк рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ред рдЬрдмрдХрд┐ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд▓реЙрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрд╛ рдЧрдпрд╛ рдерд╛ (рд▓реИрдкрдЯреЙрдк рдкрд░ рдЖрдИрдбреАрдИ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рдереА), рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╕рдордп рдмреАрдд рдЧрдпрд╛ред рдФрд░ рдЕрдм, рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдереАред
рдЬреИрд╕реЗ рд╣реА рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдореЗрдореЛрд░реА рдирд╣реАрдВ рд╣реИ (рд░рд┐рдЯрд░реНрди рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП), рдЪреБрдбрд╝реИрд▓ рдХрд╛ рд╢рд┐рдХрд╛рд░ рд╢реБрд░реВ рд╣реБрдЖ: рд╕рднреА рдЬрдЯрд┐рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдкрд░ рд╕рдВрджреЗрд╣ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛, рдЬрд┐рд╕рдХреЗ рдХреЛрдб рдореЗрдВ рд╢реИрддрд╛рди рдЕрдкрдирд╛ рдкреИрд░ рддреЛрдбрд╝ рджреЗрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рд╕реЗ рд╕реБрдЧрдо рдерд╛ рдХрд┐ рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо рдиреЗ GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрдЯ рд╣реБрдИ рдереАред рдпрджрд┐ рдХреЗрд╡рд▓ рд╕реАрдкреАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдордиреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬреЛ GPU рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд░рд╛рд╕реНрддреЗ рдореЗрдВ, рдореЗрдореЛрд░реА рд░рд┐рд╕рд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рдИ рдЧрдИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдареАрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рд╕реЗ рдореВрд▓ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реБрдИред рд╡реИрд╕реЗ рднреА рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рдзрд╛рд░рд╛рдПрдБ рдмрдирдирд╛ рдмрдВрдж рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред
рдПрдХ рдФрд░ рд░реЛрдбрд╝рд╛ рдпрд╣ рдерд╛ рдХрд┐ рд╕реНрдореГрддрд┐ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдИ рдереА! рдХрд╛рд░реНрдп рдкреНрд░рдмрдВрдзрдХ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдг рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд▓рдЧрднрдЧ 220 рдПрдордмреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рд▓реИрдкрдЯреЙрдк 8 рдЬреАрдмреА рд░реИрдо рд╕реЗ рд▓реИрд╕ рдерд╛ред
рд▓реЛрдб рдкрд░реАрдХреНрд╖рдг
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рдпрдВ рдкреНрд░рдХрдЯ рд╣реБрдИ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ 90 рд╕реЗ рдЕрдзрд┐рдХ рдзрд╛рдЧреЗ рдмрдирд╛рдПред рдЙрдиреНрд╣реЛрдВрдиреЗ рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рдкрд╛рдк рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛: рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рд╡рд╣ рдЕрд╕реАрдорд┐рдд рд░реВрдк рд╕реЗ рдзрд╛рдЧреЗ рдмрдирд╛рдиреЗ рд▓рдЧреЗред рдпрд╣ рдПрдХ рд╕рдордп рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕реАрдорд╛ рдХреЛ рд╣рдЯрд╛рдиреЗ, рдФрд░ 1000 рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ, рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдбрд┐рдмрдЧрд┐рдВрдЧ рдорд╢реАрди рдкрд░, рдкреВрд░реЗ рд╣рдЬрд╛рд░ рдзрд╛рдЧреЗ рдПрдХ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЧрдП рдереЗ, рд▓реЗрдХрд┐рди рд▓рдХреНрд╖реНрдп рд▓реИрдкрдЯреЙрдк рдкрд░ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ: рдЬреАрдпреВрдЖрдИ рдЕрд▓рдЧ рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛ред
рд▓реЗрдХрд┐рди рд╕рднреА рдЖрд╢рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реНрд░реЛрдд
рд╕рд┐рд╕рд┐рдиреНрдЯрд░реНрдирд▓реНрд╕ рд╕реЗ
рдЯреЗрд╕реНрдЯрд▓рд┐рдорд┐рдЯ рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рддреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛: рд▓рдХреНрд╖реНрдп рд▓реИрдкрдЯреЙрдк рдкрд░, рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ 1000 рдзрд╛рдЧреЗ рдпрд╛ рдЕрдзрд┐рдХ рдмрдирд╛рдПред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЛ рдЕрдзрд┐рдХ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рд╣реИ, рдПрдХ рдкреНрд░рдХрд╛рд╢ рдзреБрдВрдз рдХреА рддрд░рд╣ рдкрд┐рдШрд▓ рдЧрдпрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдЕрднреА рднреА рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдереАред
RTFM
рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдпрд╣ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓рдХреНрд╖реНрдп рд▓реИрдкрдЯреЙрдк рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣рд╛рдВ рдПрдХ рдорд┐рд╕рдлрд╛рдпрд░ рд╣реИ: рдпрджрд┐ рдЖрдк рдПрдХ рдирдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХреЗ рддрд╣рдд рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрд┐рдирд╛ рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЬрдм рд╣рд╛рде рдЧрд┐рд░рдиреЗ рд▓рдЧреЗ, рддрдм рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (umpteenth рд╕рдордп рдХреЗ рд▓рд┐рдП) рдиреЗ MSDN рдкрд░ CreateThread () рдкрд░ рдорджрдж рдкрдврд╝реАред рдФрд░ рдмрд╕ рдХрд╛рд╕реНрдХреЗрдЯ рдЦреЛрд▓рд╛:
"рдпрджрд┐ CreateThread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдзрд╛рдЧрд╛ CRT рдХрд╣рддрд╛ рд╣реИ, рддреЛ CRT рдХрдо-рдореЗрдореЛрд░реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред" (
рдкреНрд░рдорд╛рдг )
рд╕рдорд╛рдзрд╛рди: CreateThread () рдХреЗ рдмрдЬрд╛рдп рдереНрд░реЗрдбреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
_beginthreadex () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣
"_beginthread vs CreateThread:" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд┐рд╖рдп рдХреЗ рд╕рд╛рде рд╕рд╣рд╛рдпрддрд╛ рдкреГрд╖реНрда рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛
?рдореБрдЭреЗ рддреБрд░рдВрдд рдпрд╛рдж рдЖрдпрд╛ рдХрд┐ рднрд╛рд░реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рдХреНрд╖реНрдп рд▓реИрдкрдЯреЙрдк рдкрд░ рдмрджрд▓ рдЧрдП, рдЬреЛ
рдХрдо-рдореЗрдореЛрд░реА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдереНрд░реЗрдб рдкреВрд▓ рдХреЛ
_beginthreadex () рдФрд░ рдЕрдВрдд рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ ... рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд╣реБрдИ рд╣реИред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдЕрдХреНрд╕рд░ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рд╣реБрдЖ рдерд╛ред рдФрд░ рд╕рднреА рдХреНрдпреЛрдВрдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдзрд╛рдЧреЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рдереЗ рдФрд░ рдкреВрд▓ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдП рдЧрдП рдереЗред
рдЬрдм рд╕рднреА рдХреЙрд▓
CreateThread () рдХреЛ
_beginthreadex () (рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╢рд╛рдорд┐рд▓
) рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЕрдВрддрддрдГ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдореБрдЦреНрдп рдХрдард┐рдирд╛рдИ рдпрд╣ рдереА рдХрд┐ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╢реАрди рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреБрди: рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕реА рд╕рдордп, рд╣рдорд╛рд░реЗ рд╕рднреА рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдмреЗрдХрд╛рд░ рд╣реЛ рдЧрдП, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдУрдПрд╕ рдкрд░ рд▓реЛрдб рдХреЗ рдЕрдзрд┐рдХ рдЕрдиреБрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред
рдХреНрдпрд╛ рдЖрдк рд╡рд╛рдХрдИ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?
рджреВрд╕рд░реА рд╕реНрдерд┐рддрд┐ред
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП : рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдХрд╛рдо рдХреЗ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ, <рдлрд╝рд╛рдЗрд▓ рдирд╛рдо> рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, <рдлрд╝рд╛рдЗрд▓ рдирд╛рдо> рдлрд╝рд╛рдЗрд▓ рд░рд┐рдЯрд░реНрди рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп
рд╕рд╣реА рд╣реИ ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
bool exist( const wchar_t* filename ) { bool result = !_waccess( filename, 0 ); if( result ) { return true; } WIN32_FIND_DATAW attrs; HANDLE handle = FindFirstFileW( filename, &attrs ); if( handle == INVALID_HANDLE_VALUE ) { return false; } FindClose( handle ); return !!attrs.dwFileAttributes; }
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрддреНрдкрдиреНрди CRT рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ
_waccess () рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдкрд╛рдк рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реВрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрд┐рд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрдирд╛рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрд╕рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐
_wremove () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдП
рдЬрд╛рдиреЗ рдХреЗ
рдмрд╛рдж ,
FindFirstFileW () рдлрд╝рдВрдХреНрд╢рди рдЕрднреА рднреА рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкрд╛ рд╕рдХрддрд╛ рд╣реИ! рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП NTFS рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдХреБрдЫ рдЧреИрд░-рд╢реВрдиреНрдп рд╕рдордп рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрд╕реНрддрд┐рддреНрд╡ рдЪреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред
рдареАрдХ рд╣реИ, рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВред рдмрд╕ рдЗрд╕ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред
рдЕрдм
рдореМрдЬреВрдж () рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИ? рд╡рд╣рд╛рдБ рдпрд╣ рдерд╛!
рдореИрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛, рдмрд╛рдВрдХрд╛!
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рд╕рдорд╕реНрдпрд╛ рдирд┐рдореНрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рдореЗрдВ рдереА:
- рдлрд╝рд╛рдЗрд▓ рдХреЛ рдирд╖реНрдЯ рдХрд░реЗрдВ <dest_file>
- рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ <source_file> рд╕реЗ <dest_file>
рдЕрд░реНрдерд╛рддреН, рдирд╛рдо рдмрджрд▓рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп: рдЗрд╕рдореЗрдВ
рдореМрдЬреВрдж () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдордХрд░рдг рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдерд╛ред рд╕реБрдзрд╛рд░ рдХреЗ рдмрд╛рдж, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛:
void test() { const wchar_t firstName[] = "alice.txt"; const wchar_t secondName[] = "bob.txt"; int mode = _S_IREAD | _S_IWRITE; // int handle = _wcreat( firstName, mode ); ::close( handle ); // handle = _wcreat( secondName, mode ); ::close( handle ); while( true ) { // _wremove( secondName ); // , assert( !exist( secondName ) ); // _wrename( firstName, secondName ); // _wrename( secondName, firstName ); // handle = _wcreat( secondName, mode ); ::close( handle ); } }
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рджреЗрдЦрд╛ рдЧрдпрд╛:
void test() { const wchar_t fileName[] = "test.txt"; int mode = _S_IREAD | _S_IWRITE; while( true ) { // int handle = _wcreat( fileName, mode ); ::close( handle ); // , assert( exist( fileName ) ); // _wremove( fileName ); // , assert( !exist( fileName )); } }
рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдореЗрдВ,
рдореМрдЬреВрдж () рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛: рд╕рдордп рдХреЗ рд╕рд╛рде, рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрднрд╛рд╡ рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рд╕реЗ рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рд╣реБрдЖред рд╣рдордиреЗ рдЕрдиреБрд░реЛрдзрд┐рдд рдлрд╝рд╛рдЗрд▓ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХреЛ рд╣рдЯрд╛рдХрд░ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ред рдФрд░ рдлрд┐рд░
_wcreat () рдлрд╝рдВрдХреНрд╢рди
рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рд▓рдЧрд╛! рд▓реВрдк рдХреЗ 800 рд╡реЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ (рдпрд╛ рдкрд╣рд▓реЗ рднреА) рдХреЗ рдмрд╛рдж, рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ ...
_Wcreat () CreateFile () рдкрд░ рдПрдХ рдЖрд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рдордп, рдЕрдВрддрд┐рдо рдлрд╝рдВрдХреНрд╢рди рд░рд┐рдЯрд░реНрди рдХреЛрдб
"ACCESS_DENIED" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛! рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рдордиреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдмрддрд╛рдпрд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрд╛рдБрдЪ рдХреА рдХрд┐ рдХреЛрдИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдереА, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдбреНрд░рд╛рдЗрд╡рд░ рдиреЗ рдЕрднреА рднреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рд╕реЗ рдЗрдирдХрд╛рд░ред
рд╕рдорд╛рдзрд╛рди: рд╣рдордиреЗ рдЙрд╕реЗ рдирд╣реАрдВ рдвреВрдВрдврд╛ рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдереА, рд╣рдордиреЗ рдЧрд▓рддреА рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
MoveFile () рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рд╣рдЯрд╛рдП рдЧрдП рдХрд┐рд╕реА рддреГрддреАрдп-рдкрдХреНрд╖ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ!
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдФрд░ рд╕рдорд╛рдзрд╛рди: рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рдФрд░ / рдпрд╛ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдмрдВрдж рдХрд░реЗрдВ рдЬреЛ рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдкрд╕рдВрд╣рд╛рд░
рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдФрд░ рд╣рд▓ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИред рд▓реЗрдХрд┐рди рдХреИрд╕реЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдЬрдм рдУрдПрд╕ рд╣реА рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА рд╣реИ! рдЦреИрд░, рдУрдПрд╕ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЗ рд▓рд┐рдПред рдФрд░ рдРрд╕реЗ рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЬрдм рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рддрд╕реНрд╡реАрд░ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддреА рд╣реИ:

рд╕рдВрджрд░реНрдн
рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рдорд╛рдорд▓реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреНрд▓реЙрдЧ рд╣реИ (рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП
unkinddragon рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж):
blogs.msdn.com/b/oldnewthingрд╕рдВрджрд░реНрдн:
рд░рд┐рдХреНрдЯрд░ рдЬреЗред тАЭрд╡рд┐рдВрдбреЛрдЬред рд╡рд┐рдВрдбреЛрдЬ рдХреЗ 64-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдкреНрд░рднрд╛рд╡реА Win32- рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг ┬╗рдорд╛рд░реНрдХ рд░реЛрд╕рд┐рдиреЛрд╡рд┐рдЪ, рдбреЗрд╡рд┐рдб рд╕реЛрд▓реЛрдорди, рдПрд▓реЗрдХреНрд╕ рдЖрдпрдирд╕реНрдХреБ "рд╡рд┐рдВрдбреЛрдЬ рдЗрдВрдЯрд░рдирд▓реНрд╕ (5 рд╡рд╛рдВ рд╕рдВрд╕реНрдХрд░рдг)"UPD 1: рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдореЗрд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╣реИ:
рдкрд░реАрдХреНрд╖рдг рд╕реНрд░реЛрдд #include "sys/stat.h" #include "stdio.h" #include "io.h" #include "Windows.h" #include "Share.h" #include "fcntl.h" #include "assert.h" bool createFile( const wchar_t* fileName ) { int mode = _S_IREAD | _S_IWRITE; int handle = _wcreat( fileName, mode ); if( handle == -1 ) { printf( "_wcreat failed with error code %u\n", errno ); } else { _close( handle ); } return handle != -1; } bool createFileSafe( const wchar_t* fileName ) { int operMode = _O_CREAT; int sharMode = _SH_DENYNO; int permMode = _S_IREAD | _S_IWRITE; int handle = 0; errno_t error = _wsopen_s( &handle, fileName, operMode, sharMode, permMode ); if( handle == -1 ) { printf( "_wsopen_s failed with error code %u\n", errno ); } else { _close( handle ); } return handle != -1; } bool deleteFile( const wchar_t* fileName ) { int result = _wremove( fileName ); if( result == -1 ) { printf( "_wremove failed with error code %u\n", errno ); } return !result; } bool renameFile( const wchar_t* src, const wchar_t* dst ) { int result = _wrename( src, dst ); if( result ) { printf( "_wrename failed with error code %u\n", errno ); } return !result; } bool exist( const wchar_t* fileName ) { int mode = 0; int result = _waccess( fileName, mode ); return !result; } void testCreateFile() { printf( "Testing _wcreate()...\n" ); const wchar_t testFileName[] = L"test.txt"; int iteration = 1; while( true ) { bool result = createFile( testFileName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } assert( exist( testFileName ) ); result = deleteFile( testFileName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } assert( !exist( testFileName ) ); ++iteration; } printf( "\n\n" ); } void testCreateFileSafe() { printf( "Testing _wsopen_s()...\n" ); const wchar_t testFileName[] = L"test_safe.txt"; int iteration = 1; while( true ) { bool result = createFileSafe( testFileName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } assert( exist( testFileName ) ); result = deleteFile( testFileName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } assert( !exist( testFileName ) ); ++iteration; } printf( "\n\n" ); } void testRenameFile() { printf( "Testing _wrename()...\n" ); const wchar_t firstName[] = L"first.txt"; const wchar_t secondName[] = L"second.txt"; createFileSafe( firstName ); createFileSafe( secondName ); int iteration = 1; while( true ) { assert( exist( firstName ) ); assert( exist( secondName ) ); bool result = deleteFile( secondName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } assert( !exist( secondName ) ); result = renameFile( firstName, secondName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } assert( exist( !firstName ) ); assert( exist( secondName ) ); result = renameFile( secondName, firstName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } assert( exist( firstName ) ); assert( !exist( secondName ) ); result = createFileSafe( secondName ); if( !result ) { printf( "Iteration = %d", iteration ); break; } ++iteration; } printf( "\n\n" ); } int main( int argc, const char argv[] ) { testCreateFile(); testCreateFileSafe(); testRenameFile(); return 0; }
рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВ рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдореЗрд░реЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рджреВрд╕рд░реА рд╕реНрдерд┐рддрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рд╕реЗ: рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рдХреНрдпреЛрд░рд┐рдЯреА рдПрд╕реЗрдВрд╢рд┐рдпрд▓ред
UPD 2: рд╕реНрдерд┐рддрд┐ 2 рдХреЛ рдЯрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рдПрдВрдЯреАрд╡рд╛рдпрд░рд╕ рдФрд░ / рдпрд╛ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рд░реНрдорд┐рдд рдлрд╝рд╛рдЗрд▓ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЗрд╕ рдирд┐рд░реНрдгрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдореБрджрд╛рдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)ред