
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЕрдВрджрд░ рджреЗрдЦрд╛, рдпрджреНрдпрдкрд┐ рдХрд╛рд▓реНрдкрдирд┐рдХред рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░ рдХреЛрдб рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдЖрдВрддрд░рд┐рдХ рд░реАрдб / рдЕрдиреБрдХреВрд▓рди рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдХрд┐рд╕ рд╕реАрдорд╛ рддрдХ рдЕрдиреБрдордд рд╣реИред рдпреЗ рдЯрд┐рдкреНрд╕ рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рд╣реИрдВред рдореЗрдореЛрд░реА рдЕрд╡рд░реЛрдз рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рджреВрд╕рд░реЗ рдХреЛ рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЛ рд╕реНрдЯреНрд░реАрдорд▓рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдХреИрд╢ рдХреЗ рд▓рд┐рдП - рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗрд╡рд▓ рдХреИрд╢ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрджреЗрд╢ рдХреА "рдЧрдВрднреАрд░рддрд╛" рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИ - рдкреНрд░рддреНрдпреЗрдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ "рдкрд╕рдВрдж" рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреА рд╣реИред рдХреБрдЫ рдореЗрдореЛрд░реА рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдЧрд╛рд░рдВрдЯреА рдХрд╛ рдПрдХ рд╕реЗрдЯ рдЬреЛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо C ++ 11 рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗред
рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд▓рдШреБ-рд╕рдореАрдХреНрд╖рд╛рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рдПрдХ рдЦреБрд▓реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН, рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдХрдордЬреЛрд░-рдХреНрд░рдо рд╡рд╛рд▓рд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдкреИрдВрддрд░реЗрдмрд╛рдЬрд╝реА рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреНрдпреЛрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд▓реЗ рдЬрд╛рдХрд░ред рдХреБрдЫ рджрд╛рдпрд┐рддреНрд╡реЛрдВ?) рд▓реЗрдХрд┐рди рдлрд┐рд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рдмреЛрддрд▓ рд╕реЗ рдЬрд┐рдиреНрди рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, - рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬрд╝ рдЫрдд рдХреЗ рдЦрд┐рд▓рд╛рдл рднрд╛рдЧ рдЧрдпрд╛, рдФрд░ рдирд┐рд░реНрдорд╛рддрд╛рдУрдВ рдиреЗ рд╣рд░ рдЬрдЧрд╣ рдорд▓реНрдЯреА-рдХреЛрд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдирддреАрдЬрддрди, рдЕрд╕рд▓реА рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдЬрдирддрд╛ рдХреЗ рдкрд╛рд╕ рдЧрдпрд╛ред рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрд▓рд╛рд░реНрдо рдмрдЬрдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рдереЗ: рдЙрдиреНрд╣реЗрдВ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдорд▓реНрдЯреА-рдХреЛрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдХрдордЬреЛрд░ рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдХреЛрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИрдВред рддрдм рднрд╛рд╖рд╛ рдорд╛рдирдХреАрдХрд░рдг рдЕрдВрдЧреЛрдВ рдиреЗ рдЦреБрдж рдХреЛ рдПрдХ рд╕рд╛рде рдЦреАрдВрдЪ рд▓рд┐рдпрд╛: рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реЛ рдЧрдП, рдпрд╣ рднрд╛рд╖рд╛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ рдорд╛рдирдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдерд╛, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЧрд╛рд░рдВрдЯреА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рдереЗред рдирддреАрдЬрддрди, рдЖрдЬ рд▓рдЧрднрдЧ рд╕рднреА рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВ, рдФрд░ рдЬрд╛рд╡рд╛, .NET, C ++ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЗ рдорд╛рдирдХреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рдИ рд╣реИред
рд╕реА ++ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЪреАрдЬреЛрдВ рдХреЛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдкрдиреА рдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕рд┐рджреНрдз рд╣реИред C ++ 11 рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдХрд╛рд░реНрдп рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рдирд╛ рдерд╛, рдЕрд░реНрдерд╛рдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрдзрд┐рдХрддрдо рд▓рдЪреАрд▓рд╛рдкрди рджреЗрдирд╛ред рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЬрд╛рд╡рд╛) рдХреЗ рдореМрдЬреВрджрд╛ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдФрд░ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдорд░реА рдФрд░ рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдорд╛рдирдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдПрдХ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐
рддреАрди рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ рдЖрдЧреЗ рд░рдЦрд╛:
- рдХреНрд░рдорд┐рдХ рд╕рдВрдЧрддрд┐
- рдЕрдзрд┐рдЧреНрд░рд╣рд┐рдд / рдЬрд╛рд░реА рдХрд░рдирд╛
- рдЖрд░рд╛рдо рд╕реНрдореГрддрд┐ рдЖрджреЗрд╢
рдЗрди рд╕рднреА рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ C ++ рдореЗрдВ рдПрдХ рдПрдиреНрдпреВрдорд░реЗрд╢рди -
std::memory_order
рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 6 рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИрдВ:
memory_order_seq_cst
- рдХреНрд░рдорд┐рдХ рд╕реБрд╕рдВрдЧрдд рдореЙрдбрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИmemory_order_acquire
, memory_order_release
, memory_order_acq_rel
, memory_order_consume
- рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд╡рд┐рдореЛрдЪрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдореЙрдбрд▓ рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗрдВmemory_order_relaxed
- рдПрдХ рдЖрд░рд╛рдо рдореЙрдбрд▓ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ
рдЗрди рдореЙрдбрд▓реЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдкрд░рдорд╛рдгреБ рдЕрднрд┐рдпрд╛рдиреЛрдВ рдкрд░ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛ред
рдЬрд┐рди рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рдореИрдВрдиреЗ
рдПрдЯрдореЙрд╕рд┐рдЯреА рдкрд░ рд▓реЗрдЦ рдореЗрдВ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛ рд╣реИ, рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рдФрд░ рдмрдбрд╝реЗ, рд╕реА ++ 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 рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдкрддрдиред рд╢рд╛рдпрдж рд╣рдо рдХреБрдЫ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдвреВрдВрдвреЗрдВрдЧреЗ рдФрд░ рдареАрдХ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡реИрд╕реЗ рднреА - рд╣рдорд╛рд░реА рд▓реЙрдХ-рдлреНрд░реА рд╕реНрдЯреИрдХ рдЧрд┐рд░ рдЬрд╛рдПрдЧреАред рдХреНрдпреЛрдВ?
рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рддреНрд░реБрдЯрд┐ рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреА рд▓рд╛рдЗрдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдорди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ
рдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рдЦреНрдд рдореЗрдореЛрд░реА рдореЙрдбрд▓ рд╣реИ, рдЬреЛ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП
рдХреНрд░рдо рдореЗрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП:
рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рдХреЛрдИ рднреА рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕реНрд╡реИрдк
a.store / b.load
рдФрд░
x.load / y.store
ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдореИрдВ рд▓реЛрдб / рд╕реНрдЯреЛрд░ рдореЗрдВ
memory_order
рддрд░реНрдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
memory_order
рдирд╣реАрдВ
memory_order
- рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдорд╛рди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВред
рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдПрдХ рд╣реА рдЧрд╛рд░рдВрдЯреА рд╕рдВрдХрд▓рдХ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ: рд╕рдВрдХрд▓рдХ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреБрдирдГ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐
memory_order_seq_cst
рдмрд╛рдж рд╕рдВрдЪрд╛рд▓рди рдЗрд╕ рдмрд╛рдзрд╛ рд╕реЗ рдКрдкрд░ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд - se__stst- рдмрд╛рдзрд╛
рд╕реЗ рдкрд╣рд▓реЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдмрд╛рдзрд╛ рд╕реЗ рдиреАрдЪреЗ рдЫреЛрдбрд╝рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдореЙрдбрд▓ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдордиреБрд╖реНрдпреЛрдВ рдХреЗ рдХрд░реАрдм рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рджреЛрд╖ рд╣реИ: рдпрд╣ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рдЦреНрдд рд╣реИред рдпрд╣ рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рдореЗрдореЛрд░реА рдмрд╛рдзрд╛рдУрдВ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЯреНрдЯрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирдП C ++ рдорд╛рдирдХ рдиреЗ рдРрд╕рд╛ рд╕рдордЭреМрддрд╛ рдЕрдкрдирд╛рдпрд╛:
- рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдореЙрдбрд▓ рдХреЛ рдЕрдкрдиреА рдХрдареЛрд░рддрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- C ++ рдореЗрдВ рдЕрдиреНрдп, рдХрдордЬреЛрд░ рдореЗрдореЛрд░реА рдореЙрдбрд▓ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдВ рдЬреЛ рдЖрдзреБрдирд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ
рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдзрд┐рдЧреНрд░рд╣рд┐рдд / рд░рд┐рд▓реАрдЬ рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдореЙрдбрд▓ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдПрдХреНрд╡рд╛рдпрд░реНрдб / рд░рд┐рд▓реАрдЬрд╝ рд╢рдмреНрджрд╛рд░реНрде
рдирд╛рдо рдЕрдзрд┐рдЧреНрд░рд╣рдг-рд░рд┐рд▓реАрдЬрд╝ рд╢рдмреНрджрд╛рд░реНрде рд╕реЗ, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рдХрд┐рд╕реА рддрд░рд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг (рдЕрдзрд┐рдЧреНрд░рд╣рдг) рдФрд░ рд░рд┐рд▓реАрдЬрд╝ (рд░рд┐рд▓реАрдЬрд╝) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╣реИред рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рдЗрд╕реЗ рдореЗрдореЛрд░реА рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдирд╛ рд╣реИ, рдЗрд╕реЗ рдЬрд╛рд░реА рдХрд░рдирд╛, рд░рдЬрд┐рд╕реНрдЯрд░ рд╕реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╣реИ:
load memory, register ; membar #LoadLoad | #LoadStore ;
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдХреЛрдб рдореЗрдВ рд╣рдордиреЗ рднрд╛рд░реА рдЕрд╡рд░реЛрдз
#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
рдкрдврд╝рдиреЗ (рд▓реЛрдб) рдХреЗ рд▓рд┐рдП, рдорд╛рдиреНрдп рдорд╛рди рд╣реИрдВ
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 рд╡рд┐рдХрд▓реНрдк рд╕рдВрднрд╡ рд╣реИрдВ:
memory_order_seq_cst
- RMW рдСрдкрд░реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рдкреНрд░рдореБрдЦ рддрддреНрд╡ рд╣реИ, рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ memory_order_seq_cst
рдХрд░рдирд╛ рдФрд░ рдиреАрдЪреЗ рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИmemory_order_acq_rel
- memory_order_acq_rel
рд╕рдорд╛рди рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди RMW рдСрдкрд░реЗрд╢рди рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд░рд┐рд▓реАрдЬрд╝ рд╕реЗрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рд╣реИmemory_order_relaxed
- рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдСрдкрд░реЗрд╢рди (рдЙрд╕рдХреЗ рд▓реЛрдб рдФрд░ рд╕реНрдЯреЛрд░ рдкрд╛рд░реНрдЯреНрд╕) рдХреЛ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рдирд╛ рдХреЛрдб (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдЧреНрд░рд╣рдг / рд░рд┐рд▓реАрдЬ рдЕрдиреБрднрд╛рдЧ рдХреЗ рднреАрддрд░, рдпрджрд┐ рдСрдкрд░реЗрд╢рди рдРрд╕реЗ рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрджрд░ рд╣реИ) рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ
рдЗрди рд╕рднреА рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдЖрджрд┐рдо рдкрд░ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рдЯрдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд░реЗрдЦрд╛рдВрдХрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдПрдХ рдЕрд▓рдЧ, рдХрдордЬреЛрд░, рддрд░рд╣-рддрд░рд╣ рдХреЗ рдЕрдзрд┐рдЧреНрд░рд╣рдг-рд╢рдмреНрджрд╛рд░реНрде - рдЙрдкрднреЛрдЧ-рдкрдарди рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рдЗрд╕ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ 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 рдорд╛рдирдХ рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рднреА рд╕рдВрдХрд▓рдХ рдпрд╣рд╛рдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:- рдпрд╛ рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП - рдлрд┐рд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдРрд╕реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреА рдЧрдИ рд╣реИ рдЬрд┐рд╕рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ?
- рдпрд╛ рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реБрд╕рдВрдЧрдд рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ - "рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реЛрдЧрд╛" рдХреЗ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдПред рд▓реЗрдХрд┐рди рддрдм рдЪрд░ рдХреЛ
currentOrder
рдХреЗрд╡рд▓ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдмреНрд░реЗрдХ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ - рдпрд╛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд╡рд┐рдЪ / рдорд╛рдорд▓рд╛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ
currentOrder
ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдпрд╛ рджреЛ рдХреЛрдбрд╛рдВрддрд░рдХ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдЕрдХреНрд╖рдо рдХреЛрдб рдорд┐рд▓рддрд╛ рд╣реИред рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ - рд░рд┐рд▓реАрдЬ-рд░реАрдб рдпрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг-рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ
рдЯреЗрдореНрдкрд▓реЗрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдРрд╕реА рдХрдорд┐рдпреЛрдВ рд╕реЗ рд░рд╣рд┐рдд рд╣реИред рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ, рд╣рдореЗрдВ рдПрдиреНрдпреВрдорд░реЗрд╢рди рд╕реЗ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ memory_order
ред рд╣рд╛рдВ, рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреБрдЫ рдХреЛрдгреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ: std::Atomic<int> atomicInt ; atomicInt.store<std::memory_order_release>( 42 ) ;
рд▓реЗрдХрд┐рди, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕ "рдХреЛрдгреАрдпрддрд╛" рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдлрд╛рдпрджреЛрдВ рджреНрд╡рд╛рд░рд╛ рдореБрдЖрд╡рдЬрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, - рд╕рдВрдХрд▓рди рдХреЗ рджреМрд░рд╛рди рдСрдкрд░реЗрд╢рди рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрд╕реНрдкрд╖реНрдЯрддрд╛редрд╕реА ++ 11 рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХрдорд╛рддреНрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬреЛ рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рд╕реА рдХреЗ рд╕рд╛рде рдХреБрдЦреНрдпрд╛рдд рд╕рдВрдЧрддрддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдХреНрд▓рд╛рд╕ рдХреЗ рдЕрд▓рд╛рд╡рд╛, std::atomic
рд╕реА ++ 11 рдорд╛рдирдХ рдореБрдлреНрдд рд╕реА-рд╡реЗрдВ рдкрд░рдорд╛рдгреБ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ atomic_load
, atomic_store
рдЖрджрд┐рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдПрдХ рд╕рдордп рдореЗрдВ рд╕реА + +ред 11 рдЕрднреА рднреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣реА рдерд╛, рдореИрдВрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдлрд┐рд░ рд╡рд╣ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рдЕрднреА рднреА рдорд╛рдирдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди C ++ 11 рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд╣рдд libcds рдХреЗ рдЕрдЧрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛редрдореВрд▓ рдмрд╛рддреЗрдВ рдХрд╛ рдЕрдВрдд
рдпрд╣ рд▓реЗрдЦ рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рддреЛрдВ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖ рд╣реИ редGoogle рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдорд╛рдкреНрдд
┬л ┬╗. , - тАж
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╡рд┐рд╖рдп рдкрд░" рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХреНрд░рдо рдХрд░рддрд╛ рд╣реВрдВ - рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдоредрд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рд╢реБрд░реБрдЖрддрдореВрд▓ рдмрд╛рддреЗрдВ:
рдЕрдВрджрд░:
рдмрд╛рд╣рд░ рд╕реЗ: