рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕ред рдереНрдпреЛрд░реА: рдореЗрдореЛрд░реА рдореЙрдбрд▓


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

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо C ++ 11 рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд▓рдШреБ-рд╕рдореАрдХреНрд╖рд╛
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рдПрдХ рдЦреБрд▓реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН, рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрдордЬреЛрд░-рдХреНрд░рдо рд╡рд╛рд▓рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреИрдВрддрд░реЗрдмрд╛рдЬрд╝реА рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпреЛрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ред рдХреБрдЫ рджрд╛рдпрд┐рддреНрд╡реЛрдВ?) рд▓реЗрдХрд┐рди рдлрд┐рд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рдмреЛрддрд▓ рд╕реЗ рдЬрд┐рдиреНрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, - рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ рдЫрдд рдХреЗ рдЦрд┐рд▓рд╛рдл рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рд╣рд░ рдЬрдЧрд╣ рдорд▓реНрдЯреА-рдХреЛрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдирддреАрдЬрддрди, рдЕрд╕рд▓реА рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЬрдирддрд╛ рдХреЗ рдкрд╛рд╕ рдЧрдпрд╛ред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрд▓рд╛рд░реНрдо рдмрдЬрдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдереЗ: рдЙрдиреНрд╣реЗрдВ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдорд▓реНрдЯреА-рдХреЛрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХрдордЬреЛрд░ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдХреЛрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИрдВред рддрдм рднрд╛рд╖рд╛ рдорд╛рдирдХреАрдХрд░рдг рдЕрдВрдЧреЛрдВ рдиреЗ рдЦреБрдж рдХреЛ рдПрдХ рд╕рд╛рде рдЦреАрдВрдЪ рд▓рд┐рдпрд╛: рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реЛ рдЧрдП, рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдерд╛, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдереЗред рдирддреАрдЬрддрди, рдЖрдЬ рд▓рдЧрднрдЧ рд╕рднреА рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдФрд░ рдЬрд╛рд╡рд╛, .NET, C ++ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рдорд╛рдирдХреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдИ рд╣реИред

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

рдЗрди рд╕рднреА рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ C ++ рдореЗрдВ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди - std::memory_order рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 6 рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ:

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

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ atomic<T> рд╕рдВрдЪрд╛рд▓рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ: std::atomic<T> рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ std::atomic<T> рд╡рд░реНрдЧ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
 void store(T, memory_order = memory_order_seq_cst); T load(memory_order = memory_order_seq_cst) const; T exchange(T, memory_order = memory_order_seq_cst); bool compare_exchange_weak(T&, T, memory_order = memory_order_seq_cst); bool compare_exchange_strong(T&, T, memory_order = memory_order_seq_cst); 

рдореЗрдореЛрд░реА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░реЗрдВ
рдмреЗрд╢рдХ, C ++ 11 рдореЗрдВ рдЕрд▓рдЧ рд╕реЗ рдореБрдлреНрдд рдореЗрдореЛрд░реА рдмрд╛рдзрд╛ рдХрд╛рд░реНрдп рднреА рд╣реИрдВ:
 void atomic_thread_fence(memory_order); void atomic_signal_fence(memory_order); 

atomic_thread_fence , рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реАрдб / рд░рд╛рдЗрдЯ рдмреИрд░рд┐рдпрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдкреНрд░рдЪрд▓рд┐рдд рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐ memory_order рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЦреБрдж рдПрдХ рд░реАрдб рдмреИрд░рд┐рдпрд░ (рд▓реЛрдб / рд▓реЛрдб) рдпрд╛ рд░рд╛рдЗрдЯ рдмреИрд░рд┐рдпрд░ (рд╕реНрдЯреЛрд░ / рд╕реНрдЯреЛрд░) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
atomic_signal_fence рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдХреЛрдб рдХреЛ рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рдХ рдЕрд╡рд░реЛрдз рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, C ++ 11 рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рд╣реИред рд╣рдо рдкрд╣рд▓реЗ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рд╕рдВрдХрд▓рдХ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред

рд╕рдВрдХрд▓рдХ рдмрд╛рдзрд╛рдПрдБ


рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЛ рдХреМрди рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ? рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рд╕реНрд░реЛрдд рд╣реИ - рд╕рдВрдХрд▓рдХред
рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдзрд╛рд░рдгрд╛ (рд╢рд╛рдпрдж рдирд┐рд╣рд┐рдд) рдХреЗ рддрд╣рдд рдЕрдиреБрдХреВрд▓рди рдХреЗ рдХрдИ рддрд░реАрдХреЗ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡реИрд╢реНрд╡рд┐рдХ) рдФрд░ рд╣реЗрдпреБрд░рд┐рд╕реНрдЯрд┐рдХреНрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП (рдФрд░ рдЕрднреА рднреА рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ)ред рдХрдВрдкрд╛рдЗрд▓рд░ (рдмрд▓реНрдХрд┐, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡) рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рдВрдХреЗрдд - рдмрд╛рдзрд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдРрд╕рд╛ рдЕрд╡рд░реЛрдз рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ: рдЕрд╡рд░реЛрдз рд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЛ рдЕрд╡рд░реЛрдз рдХреЗ рдкреАрдЫреЗ рдХреЛрдб рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ (рдорд┐рд╢реНрд░рдг) рдХрд░рдиреЗ рдХреА рд╣рд┐рдореНрдордд рди рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдХрдВрдкрд╛рдЗрд▓рд░ рдмреИрд░рд┐рдпрд░ рд╕реНрд╡рдпрдВ рдХреЛрдИ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
MS Visual C ++ рдХреЗ рд▓рд┐рдП, рдХрдВрдкрд╛рдЗрд▓рд░ рдмреИрд░рд┐рдпрд░ рдЫрджреНрдо-рдлрд╝рдВрдХреНрд╢рди _ReadWriteBarrier() (рдпрд╣ рдирд╛рдо рд╣рдореЗрд╢рд╛ рдореБрдЭреЗ рдЪрдХрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рдХреЛ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдкреВрд░реНрдг рд╕рдВрдмрдВрдз - рд╕рдмрд╕реЗ рднрд╛рд░реА рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░)ред рдЬреАрд╕реАрд╕реА рдФрд░ рдХреНрд▓реИрдВрдЧ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдЪрд┐рдХрдирд╛ рдбрд┐рдЬрд╛рдЗрди рд╣реИ
__asm__ __volatile__ ( "" ::: "memory" )

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдбрд╛рдВрддрд░рдХ __asm__ __volatile__ ( тАж ) рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ GCC / __asm__ __volatile__ ( тАж ) рд▓рд┐рдП рдПрдХ рдмрд╛рдзрд╛ рд╣реИ: рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдХреЛрдб рдореЗрдВ рдпрд╛ рддреЛ рдЙрдиреНрд╣реЗрдВ рдиреАрдЪреЗ рдлреЗрдВрдХрдиреЗ рдпрд╛ рдКрдкрд░ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдЕрдзрд┐рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ ( __volatile__ рд╕рдВрд╢реЛрдзрдХ __volatile__ )ред
memory_order рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ C ++ 11 рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рддрд░рд╣ рд╕рдкреЛрд░реНрдЯ рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗ рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдмреИрд░рд┐рдпрд░ рд╣реИрдВ, рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ (рдпрд╛рдиреА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬ) рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рдЕрд╡рд░реЛрдзреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдВрдХрд▓рдХ рдирдП рдорд╛рдирдХ рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред


рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕рдВрдЧрддрд┐


рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдордиреЗ рдПрдХ рд▓реЙрдХ-рдлреНрд░реА рд╕реНрдЯреИрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ (рдпрд╣ рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИ), рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдФрд░ рд╣рдореЗрдВ рдЫрд┐рд▓рдХрд╛ (рдХреЛрд░ рдлрд╛рдЗрд▓) рдорд┐рд▓рддрд╛ рд╣реИред рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рд╣рдо рдЕрдкрдиреЗ рд▓реЙрдХ-рдлреНрд░реА рд╕реНрдЯреИрдХ рдХреЗ рд▓рд╛рдЗрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧреЛрдВ рдореЗрдВ рдХреЛрдИ рднреА рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рдЦреЛрдЬ рдкрд╛рдПрдВрдЧреЗ (рдХреЛрдИ рдбрд┐рдмрдЧрд░ рдпрд╣рд╛рдВ рд╣рдорд╛рд░реА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛), рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдФрд░ рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдХрд┐ рдзрд╛рд░рд╛ 1 рдХреЗ рд▓рд╛рдЗрди K рдХреЛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд┐рддрдирд╛ рдШрд╛рддрдХ рд╕рдВрдпреЛрдЬрди рд╣реИ рдФрд░ рд╕рд╛рде рд╣реА рдзрд╛рд░рд╛ 2 рдХреА рд▓рд╛рдЗрди N рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдкрддрдиред рд╢рд╛рдпрдж рд╣рдо рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВрдЧреЗ рдФрд░ рдареАрдХ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА - рд╣рдорд╛рд░реА рд▓реЙрдХ-рдлреНрд░реА рд╕реНрдЯреИрдХ рдЧрд┐рд░ рдЬрд╛рдПрдЧреАред рдХреНрдпреЛрдВ?
рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдорди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рдЦреНрдд рдореЗрдореЛрд░реА рдореЙрдбрд▓ рд╣реИ, рдЬреЛ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреНрд░рдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП:
 // Thread 1 atomic<int> a, b ; a.store( 5 ); int vb = b.load(); // Thread 2 atomic<int> x,y ; int vx = x.load() ; y.store( 42 ) ; 

рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдХреЛрдИ рднреА рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕реНрд╡реИрдк a.store / b.load рдФрд░ x.load / y.store ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдореИрдВ рд▓реЛрдб / рд╕реНрдЯреЛрд░ рдореЗрдВ memory_order рддрд░реНрдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ memory_order рдирд╣реАрдВ memory_order - рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдорд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред
рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЧрд╛рд░рдВрдЯреА рд╕рдВрдХрд▓рдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ: рд╕рдВрдХрд▓рдХ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреБрдирдГ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ memory_order_seq_cst рдмрд╛рдж рд╕рдВрдЪрд╛рд▓рди рдЗрд╕ рдмрд╛рдзрд╛ рд╕реЗ рдКрдкрд░ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - se__stst- рдмрд╛рдзрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдмрд╛рдзрд╛ рд╕реЗ рдиреАрдЪреЗ рдЫреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдореЙрдбрд▓ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдордиреБрд╖реНрдпреЛрдВ рдХреЗ рдХрд░реАрдм рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛрд╖ рд╣реИ: рдпрд╣ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдЦреНрдд рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рдореЗрдореЛрд░реА рдмрд╛рдзрд╛рдУрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЯреНрдЯрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирдП C ++ рдорд╛рдирдХ рдиреЗ рдРрд╕рд╛ рд╕рдордЭреМрддрд╛ рдЕрдкрдирд╛рдпрд╛:

рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдзрд┐рдЧреНрд░рд╣рд┐рдд / рд░рд┐рд▓реАрдЬ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдореЙрдбрд▓ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


рдПрдХреНрд╡рд╛рдпрд░реНрдб / рд░рд┐рд▓реАрдЬрд╝ рд╢рдмреНрджрд╛рд░реНрде


рдирд╛рдо рдЕрдзрд┐рдЧреНрд░рд╣рдг-рд░рд┐рд▓реАрдЬрд╝ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рдХрд┐рд╕реА рддрд░рд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг (рдЕрдзрд┐рдЧреНрд░рд╣рдг) рдФрд░ рд░рд┐рд▓реАрдЬрд╝ (рд░рд┐рд▓реАрдЬрд╝) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣реИред рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдЗрд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдирд╛ рд╣реИ, рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд░рдирд╛, рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ:
 load memory, register ; membar #LoadLoad | #LoadStore ; // acquire- //   acquire/release- ... membar #LoadStore | #StoreStore ; // release- store regiser, memory ; 

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

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

рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реНрдкрд┐рди-рд▓реЙрдХ рд╣реИ рдЬреЛ рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд░рд┐рд▓реАрдЬ рдкрд░ рджрд┐рдЦрддрд╛ рд╣реИ (C ++ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕реНрдкрд┐рди-рд▓реЙрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ atomic_flag рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд░рдорд╛рдгреБ-рдЪрд░ рдкрд░ рд╕реНрдкрд┐рди-рд▓реЙрдХ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реВрдВрдЧрд╛ (рдПрдХ рдмреВрд▓рд┐рдпрди рднреА рдирд╣реАрдВ) - рдпрд╣ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рд╣реИ рд▓реЗрдЦ):
 class spin_lock { atomic<unsigned int> m_spin ; public: spin_lock(): m_spin(0) {} ~spin_lock() { assert( m_spin.load(memory_order_relaxed) == 0);} void lock() { unsigned int nCur; do { nCur = 0; } while ( !m_spin.compare_exchange_weak( nCur, 1, memory_order_acquire )); } void unlock() { m_spin.store( 0, memory_order_release ); } }; 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ, рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА compare_exchange рдЕрдкрдиреЗ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓ рджреЗрддреА рд╣реИ рдпрджрд┐ CAS рдЕрд╕рдлрд▓ рд╣реИ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рддрд╛ рд╣реИ! рдЖрдкрдХреЛ рдПрдХ рдЧреИрд░-рдЦрд╛рд▓реА рдирд┐рдХрд╛рдп рдХреЗ рд╕рд╛рде do-while рд▓реВрдк рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
lock рдХреЛ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХреА lock рд╡рд┐рдзрд┐ рдореЗрдВ, рдореИрдВ рдЕрдзрд┐рдЧреНрд░рд╣рдг рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ unlock рд╡рд┐рдзрд┐ рдореЗрдВ рдореИрдВ рд░рд┐рд▓реАрдЬ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рд╡реИрд╕реЗ, рд╢рдмреНрджрд╛рд░реНрде / рд░рд┐рд▓реАрдЬ рд╢рдмреНрджрд╛рд░реНрдердХ рдиреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рдХреНрд╕ рд╕реЗ рдЕрдкрдирд╛ рдЗрддрд┐рд╣рд╛рд╕ рд▓рд┐рдпрд╛: рдорд╛рдирдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рдХреНрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдФрд░ рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд░рд┐рд▓реАрдЬ рдкреИрдЯрд░реНрди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред ) рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд░рдЦреА рдЧрдИ рдмрд╛рдзрд╛рдПрдВ lock() рдФрд░ unlock() рдХреЛ рд▓реАрдХ unlock() рдмреАрдЪ рд╕рдВрд▓рдЧреНрди рдХреЛрдб рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ - рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП! рдФрд░ m_spin рд╡реИрд░рд┐рдПрдмрд▓ рдХреА m_spin рд╣рдореЗрдВ рдЧрд╛рд░рдВрдЯреА рджреЗрддреА рд╣реИ рдХрд┐ рдЬрдм рддрдХ m_spin=1 , рдХреЛрдИ рднреА рд▓реЙрдХ рдХреЛ рдкрдХрдбрд╝ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рд╕реЗ рдХреНрдпрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ!
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ compare_exchange_weak рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ compare_exchange_weak ред рдпрд╣ рдХреНрдпрд╛ рд╣реИ


рдХрдордЬреЛрд░ рдФрд░ рдордЬрдмреВрдд рдХреИрд╕


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╛ рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо CAS (рддреБрд▓рдирд╛-рдФрд░-рд╕реНрд╡реИрдк), рдпрд╛ LL / SC рдЬреЛрдбрд╝реА (рд▓реЛрдб-рд▓рд┐рдВрдХреНрдб / рд╕реНрдЯреЛрд░-рд╕рд╢рд░реНрдд) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред LL / SC рдЬреЛрдбрд╝реА рдЖрдкрдХреЛ рдкрд░рдорд╛рдгреБ рдХреИрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд░рдорд╛рдгреБ рдирд╣реАрдВ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдХреЗ рдЕрдВрджрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрд╕реА рдХреНрд╖рдг, OS рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕реНрдЯреЛрд░-рд╕рд╢рд░реНрдд рддрдм, рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реА рд╕реАрдПрдПрд╕ false рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ false рдХрд╛ рдХрд╛рд░рдг рдбреЗрдЯрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдерд░реНрдб рдкрд╛рд░реНрдЯреА рдЗрд╡реЗрдВрдЯ рдореЗрдВ - рдПрдХ рдереНрд░реЗрдб рд░реБрдХрд╛рд╡рдЯред
рдпрд╣ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ рдХрд┐ рдорд╛рдирдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рджреЛ compare_exchange рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡реНрд╕ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ - рдХрдордЬреЛрд░ рдФрд░ рдордЬрдмреВрддред рдЗрди compare_exchange_strong compare_exchange_weak рдФрд░ compare_exchange_strong рдХрд╣рд╛ рдЬрд╛рддрд╛ compare_exchange_strong ред рдПрдХ рдХрдордЬреЛрд░ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, false рд▓реМрдЯреЗрдВ, рднрд▓реЗ рд╣реА рдЪрд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдЕрдкреЗрдХреНрд╖рд┐рдд рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛред рдЕрд░реНрдерд╛рддреН, рдПрдХ рдХрдордЬреЛрд░ CAS CAS рдХреЗ рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ false рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ true рд▓реМрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ true (рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд!) рдПрдХ рдордЬрдмреВрдд CAS рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛: рдпрд╣ CAS рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдХреБрдЫ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЖрдкрдХреЛ рдХрдм рдХрдордЬреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдХрдм - рдордЬрдмреВрдд рдХреИрд╕? рдореИрдВ рдЗрд╕ рдирд┐рдпрдо рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рдерд╛: рдпрджрд┐ CAS рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ CAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреИрдЯрд░реНрди рд╣реИ) рдФрд░ рд▓реВрдк рдореЗрдВ рдХреЛрдИ рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рд╣реИрдВ (рдЕрд░реНрдерд╛рдд, рд▓реВрдк рдХрд╛ рд╢рд░реАрд░ рд╣рд▓реНрдХрд╛ рд╣реИ), рддреЛ рдореИрдВ compare_exchange_weak - рдХрдордЬреЛрд░ CAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ compare_exchange_weak ред рдЕрдиреНрдпрдерд╛, рдПрдХ рдордЬрдмреВрдд compare_exchange_strong ред

рд╕реНрдорд╛рд░рдХреЛрдВ рдХреЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдЖрджреЗрд╢


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд memory_order рдорд╛рди рдЕрдзрд┐рдЧреНрд░рд╣рд┐рдд / рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ:

рдкрдврд╝рдиреЗ (рд▓реЛрдб) рдХреЗ рд▓рд┐рдП, рдорд╛рдиреНрдп рдорд╛рди рд╣реИрдВ memory_order_acquire рдФрд░ memory_order_consume ред
рд▓реЗрдЦрди (рд╕реНрдЯреЛрд░) рдХреЗ рд▓рд┐рдП - рдХреЗрд╡рд▓ memory_order_release ред
Memory_order_acq_rel рдХреЗрд╡рд▓ RMW рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИ - compare_exchange , exchange , fetch_xxx ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдкрд░рдорд╛рдгреБ RMW рдЖрджрд┐рдо рдореЗрдВ memory_order_acquire рдХреЛ рд╢рдмреНрджрд╛рд░реНрде, memory_order_acquire рд░рд┐рд▓реАрдЬ рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ memory_order_release рдпрд╛ рджреЛрдиреЛрдВ, memory_order_acq_rel ред RMW рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдпреЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рд╢рдмреНрджрд╛рд░реНрде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░реАрдб-рдореЙрдбрд┐рдлрд╛рдИ-рд░рд╛рдЗрдЯ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдПрдХ рд╕рд╛рде рдкрд░рдорд╛рдгреБ рд░реАрдб рдПрдВрдб рд░рд╛рдЗрдЯ рдХрд░рддрд╛ рд╣реИред рд╢рдмреНрджрд╛рд░реНрде, рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдСрдкрд░реЗрд╢рди рдХреЛ рдпрд╛ рддреЛ рдЕрдзрд┐рдЧреНрд░рд╣реАрдд рд░реАрдб рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╛ рд░рд┐рд▓реАрдЬрд╝ рд░рд┐рдХреЙрд░реНрдб рдпрд╛ рджреЛрдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдСрдкрд░реЗрд╢рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдХреЗрд╡рд▓ рдЙрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдХреНрд╕рд░, рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ, рдХреБрдЫ рднрд╛рдЧ рдЬреЛ рд╕реНрдкрд┐рди-рд▓реЙрдХ рдХреЗ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ (рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ), рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдирдП рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ) рдФрд░ рдЕрдВрдд рдореЗрдВ рд╣рдо рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рд╕реЗрдЯ (рд░рд┐рд▓реАрдЬрд╝) рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдСрдкрд░реЗрд╢рди (рдЖрдорддреМрд░ рдкрд░ рд╕реАрдПрдПрд╕) рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдкрд░реЗрд╢рди рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред рдпрджрд┐ рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдЖрджрд┐рдо (рд╕реАрдПрдПрд╕ рдпрд╛ exchange ) рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирдП рдореВрд▓реНрдп рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╣реИред "рдХрд╛рдлреА рд╕рдВрднрд╛рд╡рдирд╛" рдПрдХ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдпрд╣ рд╕рдордЭ рд╕рдХреЗрдВ рдХрд┐ рд╢рдмреНрджрд╛рд░реНрде рдПрдХ рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред
рдпрджрд┐ RMW рдЖрджрд┐рдо рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд░рд┐рд▓реАрдЬ рдкреИрдЯрд░реНрди рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ), рддреЛ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рд▓рд┐рдП 3 рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ:

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

рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ


рдПрдХ рдЕрд▓рдЧ, рдХрдордЬреЛрд░, рддрд░рд╣-рддрд░рд╣ рдХреЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг-рд╢рдмреНрджрд╛рд░реНрде - рдЙрдкрднреЛрдЧ-рдкрдарди рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рдЗрд╕ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ DEC рдЕрд▓реНрдлрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ "рд╢реНрд░рджреНрдзрд╛рдВрдЬрд▓рд┐" рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЕрд▓реНрдлрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рд╣реИ: рдпрд╣ рдбреЗрдЯрд╛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рддреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ:
 struct foo { int x; int y; } ; atomic<foo *> pFoo ; foo * p = pFoo.load( memory_order_relaxed ); int x = p->x; 

рд╡рд╣ p->x рдкрдврд╝рдиреЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдЖ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ p рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдореБрдЭрд╕реЗ рдпрд╣ рди рдкреВрдЫреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕рдВрднрд╡ рд╣реИ - рдпрд╣ рдЕрд▓реНрдлрд╛ рдЧреБрдг рд╣реИ ; рдореБрдЭреЗ рдЕрд▓реНрдлрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдФрд░ рди рд╣реА рдЗрд╕реЗ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ)ред
рдЗрд╕ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХреЗ рдкрд░рдорд╛рдгреБ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, pFoo рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдП:
 foo * p = pFoo.load( memory_order_consume ); int x = p->x; 

рдЦрдкрдд рд╢рдмреНрджрд╛рд░реНрде рдХрд╣реАрдВ рдЖрд░рд╛рдо рдФрд░ рдкрдврд╝рдиреЗ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЗ рдмреАрдЪ рдореЗрдВ рд╣реИрдВред рдХрдИ рдЖрдзреБрдирд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░, рдпрд╣ рдЖрд░рд╛рдо рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдлрд┐рд░ рд╕реЗ рдХреИрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдКрдкрд░, рдореИрдВрдиреЗ рджреЛ рдХреИрд╕ рдХреЗ рд╕рд╛рде atomic<T> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ - рдХрдордЬреЛрд░ рдФрд░ рдордЬрдмреВрддред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, CAS рдХреЗ рджреЛ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣реИрдВ - рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ memory_order :
 bool compare_exchange_weak(T&, T, memory_order successOrder, memory_order failedOrder ); bool compare_exchange_strong(T&, T, memory_order successOrder, memory_order failedOrder ); 

рдпрд╣ рддрд░реНрдХ рдХреНрдпрд╛ рд╣реИ - failedOrder
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ CAS рдПрдХ рд░реАрдб-рдореЙрдбрд┐рдлрд╝рд╛рдЗрдб-рд░рд╛рдЗрдЯ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрд░рдорд╛рдгреБ рд░реАрдбрд┐рдВрдЧ рдХрд░рддрд╛ рд╣реИред failedOrder рддрд░реНрдХ рд╕рд┐рд░реНрдл рдЗрд╕ рдкрдврд╝рдиреЗ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдХреИрд╕ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реАрдВ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, "рд╡рд┐рдлрд▓рддрд╛ рдкрд░ рд╢рдмреНрджрд╛рд░реНрде" рдХреЗ рд╕рдВрдХреЗрдд рдХреА рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ!

рдЖрд░рд╛рдо рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде


рдЕрдВрдд рдореЗрдВ, рддреАрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдореЙрдбрд▓ рдХреЛ рдЖрд░рд╛рдо рд╕реЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо - рд▓реЛрдб, рд╕реНрдЯреЛрд░, рд╕рднреА рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ - рдФрд░ рдЬреЛ рд▓рдЧрднрдЧ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЕрдкрдиреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реБрдП рд▓рдЧрднрдЧ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓рдЧрднрдЧ рдХреНрдпреЛрдВ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдирдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЖрд░рд╛рдо рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдкрд░рдорд╛рдгреБрддрд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдЖрд░рд╛рдо рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рднреА рдЖрдВрд╢рд┐рдХ рдкреНрд░рднрд╛рд╡ рдХреЗ рдмрд┐рдирд╛, рдЕрд╡рд┐рднрд╛рдЬреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рджреВрд╕рд░реЗ, рдЕрдЯрдХрд▓реЗрдВ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкрд░рдорд╛рдгреБ рдЖрд░рд╛рдо рд╕реЗ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИред
рдпреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдХреБрдЫ рдХрдордЬреЛрд░ рд░реВрдк рд╕реЗ рдЖрджреЗрд╢рд┐рдд рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдкрд░рдорд╛рдгреБ рдЖрд░рд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрдЯреЗрд▓ рдЗрдЯреЗрдирд┐рдпрдо рдкрд░ рдПрдХ рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреЗ рдЖрд░рд╛рдо рд╕реЗ рд▓реЛрдб рдХреЛ рд▓реЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ load.acq (рд░реАрдбрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрдЯреЗрдирд┐рдпрдо рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреЛ рд╕реА ++ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рди рдХрд░реЗрдВ)ред
рдЗрдЯреЗрдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз
рдЕрдкрдиреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ, рдореИрдВ рдЕрдХреНрд╕рд░ рдЗрдВрдЯреЗрд▓ рдЗрдЯреЗрдирд┐рдпрдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реВрдВред рдЖрдкрдХреЛ рдпрд╣ рдЖрднрд╛рд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрдЯреЗрдирд┐рдпрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдкреНрд░рд╢рдВрд╕рдХ рд╣реВрдВ, рдЬреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рдорд░ рд░рд╣рд╛ рд╣реИред рдирд╣реАрдВ, рдореИрдВ рдкреНрд░рд╢рдВрд╕рдХ рдирд╣реАрдВ рд╣реВрдВ, рд▓реЗрдХрд┐рди ...
Itanium VLIW рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдмрдирд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рджреВрд╕рд░реЛрдВ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рд╣реИред рдореЗрдореЛрд░реА рдСрд░реНрдбрд░рд┐рдВрдЧ рдХреЛ рд▓реЛрдб / рд╕реНрдЯреЛрд░ / рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рддреНрдпрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╢рд░реНрддреЗрдВ - рдЕрдзрд┐рдЧреНрд░рд╣рдг, рд░рд┐рд▓реАрдЬ, - рдпрд╣ рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИрдВ рдХрд┐ рд╕реА ++ 11 рдХреЛ рдЗрдЯреЗрдирд┐рдпрдо рд╕реЗ рд╡рд┐рдШрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрджрд┐ рд╣рдо рдХрд╣рд╛рдиреА рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрдЯреЗрдирд┐рдпрдо рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╣реИ (рдпрд╛ рдЗрд╕рдХреЗ рд╡рдВрд╢рдЬ) рдХрд┐ рд╣рдо рд╕рднреА рдмреИрдареЗ рд░рд╣реЗрдВрдЧреЗ рдЕрдЧрд░ рдПрдПрдордбреА рдиреЗ рд╕рдордп рдкрд░ рдЙрдкрджреНрд░рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдФрд░ рдПрдПрдордбреА 64 рдЬрд╛рд░реА рдХрд┐рдпрд╛ - 64-рдмрд┐рдЯ x86 рдПрдХреНрд╕рдЯреЗрдВрд╢рдиред рдЙрд╕ рд╕рдордп рдЗрдВрдЯреЗрд▓ 64-рдмрд┐рдЯ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдзреАрд░реЗ-рдзреАрд░реЗ рдПрдХ рдирдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред рдФрд░ рдЗрд╕ рдирдИ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ред рд╕рдВрдХреЗрдд рд╕реЗ, рдпрд╣ рд╕рдордЭрдирд╛ рд╕рдВрднрд╡ рдерд╛ рдХрд┐ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ рдЗрдЯреЗрдирд┐рдпрдо рд╣рдорд╛рд░рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╡реИрд╕реЗ, Microsoft рд╡рд┐рдВрдбреЛрдЬ рдкреЛрд░реНрдЯ рдФрд░ рдЗрдЯреЗрдирд┐рдпрдо рдХреЗ рд▓рд┐рдП рд╡рд┐рдЬреБрдЕрд▓ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рднреА рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╡рд╛рд╣реА рджреЗрддреЗ рд╣реИрдВ (рдХреНрдпрд╛ рдХрд┐рд╕реА рдиреЗ рдЗрдЯреЗрдирд┐рдпрдо рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдХрд╛рдо рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрд╛ рдерд╛?) рд▓реЗрдХрд┐рди рдлреБрд░реНрддреАрд▓реЗ рдПрдПрдордбреА рдиреЗ рдЗрдВрдЯреЗрд▓ рдХреА рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рдмрд░реНрдмрд╛рдж рдХрд░ рджрд┐рдпрд╛ рдерд╛, рдФрд░ рдмрд╛рдж рдореЗрдВ рддрддреНрдХрд╛рд▓ рдкрдХрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, x86 рдореЗрдВ 64 рдмрд┐рдЯреНрд╕ рдХрд╛ рдкрд░рд┐рдЪрдп рджрд┐рдпрд╛ред рдЗрдЯреЗрдирд┐рдпрдо рд╕рд░реНрд╡рд░ рдЦрдВрдб рдореЗрдВ рдмрдирд╛ рд░рд╣рд╛, рдЬрд╣рд╛рдВ рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдорд░ рд░рд╣рд╛ рдерд╛, рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣рд╛ рдерд╛ред
рдЗрд╕ рдмреАрдЪ, "рдмрд╣реБрдд рд▓рдВрдмреЗ рдирд┐рд░реНрджреЗрд╢ рд╢рдмреНрдж" (VLIW - рдмрд╣реБрдд рд▓рдВрдмреЗ рдирд┐рд░реНрджреЗрд╢ рд╢рдмреНрдж) рдореЗрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ "рдЧреБрдЪреНрдЫрд╛" рдХреЗ рд╕рд╛рде рдЗрдЯреЗрдирд┐рдпрдо рдЕрднреА рднреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕рдлрд▓рддрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╣реИред рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реНрд╡рдпрдВ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ - рдЕрдкрдиреА рдирд┐рд╖реНрдкрд╛рджрди рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреБрди: рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдЗрдЯреЗрдирд┐рдпрдо рдореЗрдВ рд╕рдВрдХрд▓рдХ рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рдВрдХрд▓рдХ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХреЗ рдФрд░ рдЙрддреНрдкрдиреНрди (рдФрд░ рдЕрднреА рднреА рдЙрддреНрдкрдиреНрди) рдмрд╣реБрдд рдЗрд╖реНрдЯрддрдо рдХреЛрдб рдирд╣реАрдВ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдХрдИ рдмрд╛рд░ рдЗрдЯреЗрдирд┐рдпрдо рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдбреВрдм рдЧрдпрд╛ - рдФрд░ рдХреЗрд╡рд▓ рддрд░реНрдХрд╣реАрди (рдЗрдЯреЗрдирд┐рдпрдо рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рдХреЗ рдХрд╛рд░рдг VLIW рдХреЗ "рдмрдВрдбрд▓реЛрдВ" рдкрд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╡рд┐рддрд░рдг (рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЗрдЯреЗрдирд┐рдпрдо рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреБрд╡рд╛рдж - "рдмрдВрдбрд▓" - рдпрд╛рдж рдХрд┐рдпрд╛ рдЧрдпрд╛), рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрдХрд╛рд░реА рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рддрд░реНрдХрд╣реАрди рд▓реЛрдбрд┐рдВрдЧред
Itanium тАУ .
, , , ?..


рд╣реЛрддрд╛ рд╣реИ-рдкрд╣рд▓реЗ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝-рдЗрди рдФрд░ рдЕрдиреНрдп рд░рд┐рд╢реНрддреЗ


рдХрд┐рд╕реА рдХреЛ рднреА рдЬреЛ рд╕реА ++ 11 рдорд╛рдирдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛: "рдЬрд╣рд╛рдБ рд░рд┐рд╢реНрддреЛрдВ рдХрд┐ рдкрд░рдорд╛рдгреБ рдЖрдкрд░реЗрд╢рди рдХреЗ рдЕрд░реНрде рд╡рд┐рдЬреНрдЮрд╛рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, - рд╣реБрдЖ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝-рд╕рд╛рде рдФрд░ рдЕрдиреНрдп?"
рдореИрдВ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗ - рдорд╛рдирдХ рдореЗрдВред
рдорд╛рдирдХ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рдПрдВрдердиреА рд╡рд┐рд▓рд┐рдпрдореНрд╕ C ++ рдХрдВрд╕реЗрдВрдЯрд░ рдЗрди рдПрдХреНрд╢рди ( рдПрдХ рд░реВрд╕реА рдЕрдиреБрд╡рд╛рдж ), рдкрд╛рдВрдЪрд╡реЗрдВ рдЕрдзреНрдпрд╛рдп рдХреА рдкреБрд╕реНрддрдХ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХрд┐рдП рдЧрдП рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
рдорд╛рдирдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рдо рдХрд┐рдпрд╛ - рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реА ++ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдореЛрдВ (рд╕рдВрдмрдВрдзреЛрдВ) рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛, рдФрд░ рдЗрди рдирд┐рдпрдореЛрдВ рдиреЗ рдореЗрдореЛрд░реА рдмрд╛рдзрд╛рдУрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдереНрд░реЗрдбреНрд╕ рдХреА рдмрд╛рддрдЪреАрдд рдХреА рдЧрд╛рд░рдВрдЯреА ред рдкрд░рд┐рдгрд╛рдо C ++ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз рд╡рд┐рд╡рд░рдг рд╣реИред
рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рдЗрди рд░рд┐рд╢реНрддреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдирд╛ рдмрд╣реБрдд рдХрдард┐рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╡рдЬрд╣ рд╕реЗ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ memory_orderрдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдЬрдЯрд┐рд▓ рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд╕рдВрдХреЗрдд рдХреА рд╢реБрджреНрдзрддрд╛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЙрдбрд▓ рд╣реИ - рдЗрд╕ рдореЙрдбрд▓ рдХреЛ memory_orderрдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рддрд░реНрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ред рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдореЙрдбрд▓ рднреА рдмреНрд░реЗрдХрд┐рдВрдЧ рд╣реИред
рдХрдордЬреЛрд░ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ - рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд░рд┐рд▓реАрдЬ рдпрд╛ рдЖрд░рд╛рдо - рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рддреНрдпрд╛рдкрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

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


рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╕рддреНрдпрд╛рдкрди


рд╣рд╛рд▓ рддрдХ рддрдХ, рдореБрдЭреЗ рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рд╛рдзрди рдкрддрд╛ рдерд╛ - рджрд┐рдорд┐рддреНрд░реА рд╡реНрдпреБрдХреЛрд╡ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЙрдбрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд░рд┐рд▓реИрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдореЙрдбрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рдХреНрдпреЛрдВ рд╕рд░рд▓реАрдХреГрдд? - рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдореЙрдбрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЖрдорддреМрд░ рдкрд░ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧреА baubles рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ рдЬреЛ рд╕реАрдзреЗ рдкреНрд░рд╢реНрди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ)ред рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рддрдм рдбреАрдмрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рддрдм, рдЬрдм рд╕рдм рдХреБрдЫ рдбреАрдмрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рд╕рд╣реА memory_orderрддрд░реНрдХреЛрдВ рд╕реЗ рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ , рдХреНрдпрд╛ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИредрдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рддрд╛рд▓рд╛-рдореБрдХреНрдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рджрд░рдЕрд╕рд▓, рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдХрд░реНрддрд╛ (рдореБрдЭреЗ рд░реВрд╕реА рд╢рдмреНрдж "рдЕрдиреБрд╡рд╛рджрдХ" рдкрд╕рдВрдж рд╣реИ - рд╡рд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рд╖рдп рдХреБрдЫ рднреА рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рд░рдЪрдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рддрд╛ рд╣реИ) рдРрд╕рд╛ рджреЛ-рдЪрд░рдгреАрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдХреНрд╕рд░ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ (рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЖрд▓рд╕реНрдп рдХреЗ рдХрд╛рд░рдг) - рд╡реЗ рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдм, рдФрд░ рдЕрдзрд┐рдорд╛рдирддрдГ рддреЗрдЬред
рдЬрд╛рд╣рд┐рд░ рддреМрд░ рдкрд░, рд░рд┐рд▓реЗрдореА рдХреЗ рд▓реЗрдЦрдХ, рджрд┐рдорд┐рддреНрд░реА рд╡реНрдпреБрдХреЛрд╡ рдиреЗ рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреА рдЙрдкрдЬ рдХреА рдЗрд╕ рдХрдореА рдХреЛ рд╕рдордЭрд╛ (рдХреЛрдИ рд╡рд┐рдбрдВрдмрдирд╛ рдирд╣реАрдВ рд╣реИ - рд░рд┐рд▓реЗрд╕реА рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдлрд▓рддрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ), рдФрд░ рдПрдХ рдмрд╛рд░ рдЗрдВрдЯреЗрд▓ рдлреЛрд░рдо рдкрд░ рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ - рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рддреНрдпрд╛рдкрди рдЙрдкрдХрд░рдг (рд░рд┐рд▓реЗрд╕реА рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ) ) рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЕрдВрджрд░ рд╕рдиреНрдирд┐рд╣рд┐рдд рдерд╛ред рдлрд┐рд░ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рдПрд╕рдЯреАрдПрд▓ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИред
рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рджрд┐рдорд┐рддреНрд░реА рдиреЗ Google рдХреЗ рдЕрдкрдиреЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ рдПрдХ рдирдпрд╛ рдЯреВрд▓ рдереНрд░реЗрдбрд╕рдиреАрдЯрд╛рдЗрдЬрд╝рд░ рдкреЗрд╢ рдХрд┐рдпрд╛ред рдпрд╣ рдЙрдкрдХрд░рдг рдЖрдкрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдбреЗрдЯрд╛ рджреМрдбрд╝ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдЖрджреЗрд╢ рджреЗрдиреЗ рдХрд╛ рд╕рд╣реА рдЖрд╡реЗрджрдиред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЛ STL рдореЗрдВ рднреА рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдВрдкрд╛рдЗрд▓рд░ (Clang 3.2, рдФрд░ рдлрд┐рд░ GCC 4.8 ) рдореЗрдВ рднреА рдЧрд╣рд░рд╛ рд╣реИ ред
ThreadSanitizer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдмрд╕ рдХреБрдЫ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ, рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ - рдФрд░ рд╡реНрдпрд╛рдкрдХ рд▓реЙрдЧ рдХреА рдЦреЛрдЬ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред рдореИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЕрдкрдиреЗ libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдореИрдВ рдПрдХ рдХрдореАрдиреЗ рд╣реВрдВ рдХрд┐ рд╕рдм рдХреБрдЫ libcds рдореЗрдВ рдХреНрд░рдо рдореЗрдВ рд╣реИред
X86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рддреНрдпрд╛рдкрди рдХрд╛ рдорд╣рддреНрд╡
x86, , (weakly-ordered) . , lock-free : , x86, .
, memory_order - null ( nop!), тАФ x86 . , release- тАУ mov , mov relaxed-.
lock-free , , x86- - .


"рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ ..." - рдорд╛рдирдХ рдХреА рдЖрд▓реЛрдЪрдирд╛


рд╣рд╛рдВ, рдореИрдВ C ++ 11 рдорд╛рдирдХ рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рд▓реЗрддрд╛ рд╣реВрдВ! рдореБрдЭреЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдкрд░рдорд╛рдгреБ рдХреЗ рддрд░реНрдХ рд╕реЗ рд╕рдВрдХреЗрдд рдорд┐рд▓рдиреЗ рдкрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдорд╛рдирдХ рдореЗрдВ рдХреНрдпреЛрдВ рдЪреБрдирд╛ рдЧрдпрд╛ ред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реЛрдЧрд╛:
 template <typename T> class atomic { template <memory_order Order = memory_order_seq_cst> T load() const ; template <memory_order Order = memory_order_seq_cst> void store( T val ) ; template <memory_order SuccessOrder = memory_order_seq_cst> bool compare_exchange_weak( T& expected, T desired ) ; //    }; 

рдореБрдЭреЗ рд╕рдордЭрд╛рдПрдВ рдХрд┐ рдореИрдВ рдХреНрдпреЛрдВ рдорд╛рдирддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЕрдзрд┐рдХ рд╕рд╣реА рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдмрд╛рд░-рдмрд╛рд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рди рдХреЗрд╡рд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╕рдВрдХрд▓рдХ рдХреЛ рднреА рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП, рд╢рдмреНрджрд╛рд░реНрде рдПрдХ [рдЕрд░реНрдз] рдЕрдиреБрдХреВрд▓рди рдмрд╛рдзрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрдХрд▓рдХ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╡реИрдз рд╢рдмреНрджрд╛рд░реНрде рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд┐рд▓реАрдЬрд╝ рд╢рдмреНрджрд╛рд░реНрде рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд╕рдВрдХрд▓рди рдХреЗ рд╕реНрддрд░ рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреНрдпрд╛ рдХрд░реЗрдЧрд╛:
 extern std::memory_order currentOrder ; std::Atomic<unsigned int> atomicInt ; atomicInt.store( 42, currentOrder ) ; 

рдпрд╣ рдХреЛрдб рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ C ++ 11 рдорд╛рдирдХ рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рднреА рд╕рдВрдХрд▓рдХ рдпрд╣рд╛рдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЯреЗрдореНрдкрд▓реЗрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдРрд╕реА рдХрдорд┐рдпреЛрдВ рд╕реЗ рд░рд╣рд┐рдд рд╣реИред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ, рд╣рдореЗрдВ рдПрдиреНрдпреВрдорд░реЗрд╢рди рд╕реЗ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ memory_orderред рд╣рд╛рдВ, рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреБрдЫ рдХреЛрдгреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
 std::Atomic<int> atomicInt ; atomicInt.store<std::memory_order_release>( 42 ) ; //   : atomicInt.template store<std::memory_order_release>( 42 ) ; 

рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ "рдХреЛрдгреАрдпрддрд╛" рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЛрдВ рджреНрд╡рд╛рд░рд╛ рдореБрдЖрд╡рдЬрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, - рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдСрдкрд░реЗрд╢рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ред
рд╕реА ++ 11 рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬреЛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╕реА рдХреЗ рд╕рд╛рде рдХреБрдЦреНрдпрд╛рдд рд╕рдВрдЧрддрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, std::atomicрд╕реА ++ 11 рдорд╛рдирдХ рдореБрдлреНрдд рд╕реА-рд╡реЗрдВ рдкрд░рдорд╛рдгреБ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ atomic_load, atomic_storeрдЖрджрд┐
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рдордп рдореЗрдВ рд╕реА + +ред 11 рдЕрднреА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣реА рдерд╛, рдореИрдВрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдлрд┐рд░ рд╡рд╣ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрднреА рднреА рдорд╛рдирдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди C ++ 11 рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд╣рдд libcds рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред

рдореВрд▓ рдмрд╛рддреЗрдВ рдХрд╛ рдЕрдВрдд


рдпрд╣ рд▓реЗрдЦ рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рддреЛрдВ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ ред
Google рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдорд╛рдкреНрдд

┬л ┬╗. , - тАж

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

рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕
рд╢реБрд░реБрдЖрдд
рдореВрд▓ рдмрд╛рддреЗрдВ:

рдЕрдВрджрд░:

рдмрд╛рд╣рд░ рд╕реЗ:

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


All Articles