.NET рдореЗрдВ рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рдФрд░ рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рд╕рд┐рдВрдХ

рдкрд░рд┐рдЪрдп


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

рд╕рдВрдХрд▓рдирдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдЕрдиреБрдХреВрд▓рди


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

class ReorderTest { private int _a; public void Foo() { var task = new Task(Bar); task.Start(); Thread.Sleep(1000); _a = 0; task.Wait(); } public void Bar() { _a = 1; while (_a == 1) { } } } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдХрд░, рдЖрдк рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлреНрд░реАрдЬ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ _a рдЪрд░ рдХреЛ рдХреИрд╢ рдХрд░рддрд╛ рд╣реИред
рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, C # рдЕрд╕реНрдерд┐рд░ рдХреАрд╡рд░реНрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЛ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрд╢реЛрдзрд┐рдд _a рдЪрд░ рдШреЛрд╖рдгрд╛ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧреАред
 private volatile int _a; 

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

рдирд┐рд░реНрджреЗрд╢ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░реЗрдВ


рдЖрдЗрдП рдЕрдм рд╣рдо рдЙрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрдм рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕реНрд░реЛрдд рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╣реЛрдиреЗ рджреЗрдВ:

 class ReorderTest2 { private int _a; private int _b; public void Foo() { _a = 1; _b = 1; } public void Bar() { if (_b == 1) { Console.WriteLine(_a); } } } 

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

.NET рдореЗрдореЛрд░реА рдореЙрдбрд▓

рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреНрд░рдорд╛рдВрдХрди рдХреЗ рдХрд╛рд░рдг рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдХреЛрдИ рднреА рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢ рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
 int a = _a; _b = 10; 

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

рдРрд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдирд┐рдпрдореЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХрд╛ рдЕрдкрдирд╛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ .NET рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ
рдХреНрд░рдордЪрдп рдкреНрд░рдХрд╛рд░рдкрд░рдореАрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреА
рд▓реЛрдб рд▓реЛрдбрд┐рдВрдЧрд╣рд╛рдВ
рд░рд┐рдХреЙрд░реНрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрд╣рд╛рдВ
рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВрд╣рд╛рдВ
рд▓рд┐рдЦрдиреЗ-рд▓рд┐рдЦрдиреЗрдирд╣реАрдВ

рдЕрдм рд╣рдо .NET рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд▓рд┐рдЦрдирд╛-рд▓рд┐рдЦрдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИ, рддреЛ рдЪрд░ _a рдХреЛ рд▓рд┐рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдЪрд░ _b рдкрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣рд╛рдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╕рдорд╕реНрдпрд╛ рдмрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╣реИред рдЪреВрдВрдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдирд┐рд╖рд┐рджреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП _b рдЪрд░ рдХреЛ _a рд╕реЗ рдкрд╣рд▓реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж, рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛:
 var tmp = _a; if (_b == 1) { Console.WriteLine(tmp); } 

рдЬрдм рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░рд╛ рдорддрд▓рдм рдПрдХ рдЪрд░ рдкрдврд╝рдиреЗ / рд╡рд┐рднрд┐рдиреНрди рдЪрд░ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдХреНрд░рдорд╛рдВрдХрди рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдПрдХ рд╣реА рдЪрд░ рдореЗрдВ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣реИ, рддреЛ рдЙрдирдХрд╛ рдХреНрд░рдо рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╣рдо рдПрдХ рд╣реА рдЪрд░ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
 var a = GetA(); UseA(a); 

рдлрд┐рд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдХрд┐ рдпрд╣рд╛рдБ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред

рд╕реНрдореГрддрд┐ рдмрд╛рдзрд╛рдПрдБ

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

.NET рд╕реНрдореГрддрд┐ рдЕрд╡рд░реЛрдзреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

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

 class ReorderTest2 { private int _a; private int _b; public void Foo() { _a = 1; _b = 1; } public void Bar() { if (_a == 1) { Thread.MemoryBarrier(); Console.WriteLine(_b); } } } 

рдкреВрд░реНрдг рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╣рд╛рдБ рдмреЗрдорд╛рдиреА рд╣реИред рдкрдврд╝рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, _a рдкрдврд╝рддреЗ рд╕рдордп рдЕрд╕реНрдерд┐рд░ рдкрдврд╝рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдпрд╣ Thread.VolatileRead рд╡рд┐рдзрд┐ рдпрд╛ рдЕрд╕реНрдерд┐рд░ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Thread.VolatileWrite рдФрд░ Thread.VolatileRead рд╡рд┐рдзрд┐рдпрд╛рдБ


рдЖрдЗрдП рдереНрд░реЗрдб рдкрд░ рджреЗрдЦреЗрдВред VolatileWrite рдФрд░ Thread.VolatileRead рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред
MSDN рдореЗрдВ VolatileWrite рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рд▓рд┐рдЦрд╛ рд╣реИ: "рдпрд╣ рдорд╛рди рдХреЛ рд╕реАрдзреЗ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдХреЛ рджрд┐рдЦрд╛рдИ рджреЗред"
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд┐рд╡рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдБ рджреЛ рдЪреАрдЬреЛрдВ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреА рд╣реИрдВ: рдХреЛрдИ рд╕рдВрдХрд▓рдХ 1 рдЕрдиреБрдХреВрд▓рди рдФрд░ рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢ рдХреНрд░рдордкрд░рд┐рд╡рд░реНрддрди рд╡рд╛рд╖реНрдкрд╢реАрд▓ рдкрдврд╝рдиреЗ рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдиреЗ рдкрд░, VolatileWrite рд╡рд┐рдзрд┐ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреА рд╣реИ рдХрд┐ рдореВрд▓реНрдп рддреБрд░рдВрдд рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдорд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ VolatileRead рд╡рд┐рдзрд┐ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреА рд╣реИ рдХрд┐ рдореВрд▓реНрдп 2 рдХреИрд╢ рд╕реЗ рдкрдврд╝рд╛ рдирд╣реАрдВ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдХреЛрдб рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреА рдХрдореА рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдХреЗ рд╕реБрд╕рдВрдЧрддрддрд╛ рдХреЗ рдХрд╛рд░рдг , рд╣рдо рдпрд╣ рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдордПрд╕рдбреАрдПрди рд╕реЗ рд╡рд┐рд╡рд░рдг рд╕рд╣реА рд╣реИред

рдЧреМрд░ рдХреАрдЬрд┐рдП рдХрд┐ рдпреЗ рддрд░реАрдХреЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ:

 [MethodImpl(MethodImplOptions.NoInlining)] public static int VolatileRead(ref int address) { int num = address; Thread.MemoryBarrier(); return num; } [MethodImpl(MethodImplOptions.NoInlining)] public static void VolatileWrite(ref int address, int value) { Thread.MemoryBarrier(); address = value; } 

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

рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрдиреБрдХреВрд▓рди

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

 public void Bar() { _a = 1; while (_a == 1) { Thread.MemoryBarrier(); } } 


рдЕрд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдЦрддрд░реЗ


VolatileWrite рдФрд░ VolatileRead рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ:
 Thread.VolatileWrite(b) Thread.VolatileRead(a) 

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

 class Program { volatile int _firstBool; volatile int _secondBool; volatile string _firstString; volatile string _secondString; int _okCount; int _failCount; static void Main(string[] args) { new Program().Go(); } private void Go() { while (true) { Parallel.Invoke(DoThreadA, DoThreadB); if (_firstString == null && _secondString == null) { _failCount++; } else { _okCount++; } Console.WriteLine("ok - {0}, fail - {1}, fail percent - {2}", _okCount, _failCount, GetFailPercent()); Clear(); } } private float GetFailPercent() { return (float)_failCount / (_okCount + _failCount) * 100; } private void Clear() { _firstBool = 0; _secondBool = 0; _firstString = null; _secondString = null; } private void DoThreadA() { _firstBool = 1; //Thread.MemoryBarrier(); if (_secondBool == 1) { _firstString = "a"; } } private void DoThreadB() { _secondBool = 1; //Thread.MemoryBarrier(); if (_firstBool == 1) { _secondString = "a"; } } } 

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

рдкреНрд░рджрд░реНрд╢рди рдереНрд░реЗрдбред рдЕрд╕реНрдерд┐рд░ * рдФрд░ рдЕрд╕реНрдерд┐рд░ рдХреАрд╡рд░реНрдб


рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╡рд┐рдВрдбреЛрдЬ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░, рдорд░рдиреЗ рд╡рд╛рд▓реЗ IA64 рдХреЛ рдЫреЛрдбрд╝рдХрд░), рд╕рднреА рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдкрдврд╝рддреЗ рд╣реИрдВ рдХреНрд░рдорд╢рдГ рд╡рд╛рд╖реНрдкрд╢реАрд▓ рд▓реЗрдЦрди рдФрд░ рд╡рд╛рд╖реНрдкрд╢реАрд▓ рд░реАрдбред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд░рди рдЯрд╛рдЗрдо рдореЗрдВ, рд╡рд╛рд╖реНрдкрд╢реАрд▓ рдХреАрд╡рд░реНрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, Thread.Volatile * рд╡рд┐рдзрд┐рдпрд╛рдБ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╡рд┐рдзрд┐ рдХреЙрд▓ рдкрд░ рд╕реНрд╡рдпрдВ рдУрд╡рд░рд╣реЗрдб, MethodImplOptions.NoInlining рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╡реЗ рдПрдХ рдкреВрд░реНрдг рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рдмрдирд╛рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред


рд╕рдВрджрд░реНрдн


1 рдкреЗрдЬ 514 рдЬреЛ рдбрдлреА рджреЗрдЦреЗрдВред рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдкрд░ рд╕рдорд╡рд░реНрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
2 рджреЗрдЦреЗрдВ VolatileWrite рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛

рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп:


  1. рдЬреЛрд╕реЗрдл рдЕрд▓рдмрд╣рд╛рд░реАред C # рдореЗрдВ рдереНрд░реЗрдбрд┐рдВрдЧ
  2. рд╡реЗрдВрд╕ рдореЙрд░рд┐рд╕рди рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдРрдкреНрд╕ рдореЗрдВ рд▓реЛ-рд▓реЙрдХ рддрдХрдиреАрдХреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдордЭреЗрдВ
  3. рдкреЗрдбреНрд░рдо рд░реЗрдЬрд╝рд╛рдИред рд╕реАрдПрд▓рдЖрд░ 2.0 рдореЗрдореЛрд░реА рдореЙрдбрд▓
  4. рдПрдордПрд╕ рдХрдиреЗрдХреНрдЯ: VolatileWrite рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛
  5. ECMA-335 рдЖрдо рднрд╛рд╖рд╛ рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ (рд╕реАрдПрд▓рдЖрдИ)
  6. рд╕реА # рднрд╛рд╖рд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛
  7. рдЬреЗрдлрд░реА рд░рд┐рдХреНрдЯрд░ C # рддреАрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдПрд▓рдЖрд░
  8. рдЬреЛ рдбрдлреАред рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдкрд░ рд╕рдорд╡рд░реНрддреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
  9. рдЬреЛрд╕реЗрдл рдЕрд▓рдмрд╣рд╛рд░реАред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕реА # 4.0

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


All Articles