
рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рджреЛ рд╕реНрддрдВрднреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ - рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдФрд░ рд╕реНрдореГрддрд┐ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗред рдпрд╣ рд▓реЗрдЦ рдкрд░рдорд╛рдгреБ рдФрд░ рдкрд░рдорд╛рдгреБ рдкреНрд░рдзрд╛рдирддрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рдШреЛрд╖рдгрд╛ ред рдЧрд░реНрдордЬреЛрд╢реА рд╕реЗ рд╕реНрд╡рд╛рдЧрдд рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж
рд╢реБрд░реВ рдХрд┐рдпрд╛ ! рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рд▓реЙрдХ-рдлреНрд░реА рдереАрдо рд╣рдмреНрд░реЛрд╕реИрдХреНрд╡рд┐рдЯреА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдпрд╣ рдореБрдЭреЗ рдЦреБрд╢ рдХрд░рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдПрдХ рд╢реИрдХреНрд╖рд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЪрдХреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ, рдореВрд▓ рд░реВрдк рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реЗ рд╣рдЯрдХрд░, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ libcds рд╕реЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдкрд╛рда рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд╛рдардХреЛрдВ рдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд┐рдП рдмрд┐рдирд╛
рдЪрд╢реНрдорд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЦрд╛рд╕рдХрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ, рдЗрд╕рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░рдг рд╣реИред рдЕрдВрддрдд:, рдФрд░ рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХреНрдпрд╛
рдмрдврд╝рд╛рд╡рд╛ рд╣реИ - рд╡рд░реНрдгрди рдХрд░реЗрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП! рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЕрдкрдиреЗ рдорд╣рд╛рдХрд╛рд╡реНрдп рдЪрдХреНрд░ рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ
рдмрд╛рдВрдЯреВрдВрдЧрд╛ :
рдмреБрдирд┐рдпрд╛рджреА рдмрд╛рддреЛрдВ ,
рдЕрдВрджрд░ рдФрд░
рдмрд╛рд╣рд░ ред рдкреНрд░рддреНрдпреЗрдХ рдорд╣рд╛рдХрд╛рд╡реНрдп рд▓реЗрдЦ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдЧрд╛ред
рдлрдВрдбрд╛рдореЗрдВрдЯрд▓ рдирд┐рдореНрди рд╕реНрддрд░ рдХреА рдЪреАрдЬреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ; рдпрд╣ рдореЗрд░реЗ рдЬреИрд╕реЗ рдХрд┐рд╕реА рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред
рдпрд╣ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рд▓реЙрдХ-рдлрд╝реНрд░реА рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдФрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдХрд╡рд░ рдХрд░реЗрдЧрд╛ - рдпрд╣ рдмрд▓реНрдХрд┐ рдПрдХ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИ рдХрд┐ рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, libcds C ++ рдХреЛрдб рдХрд╛ рдПрдХ рдЕрдЯреВрдЯ рд╕реНрд░реЛрдд рд╣реЛрдЧрд╛ред рдмрд╛рд╣рд░ рд╕реЗ libcds рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдкрд░ рд▓реЗрдЦ рд╣реЛрдВрдЧреЗ - рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕рдорд╛рдзрд╛рди, рдЯрд┐рдкреНрд╕ рдФрд░ рдПрдлрдПрдХреНрдпреВред
рдмрд╛рд╣рд░ рд╕реЗ рдЖрдкрдХреЗ рд╕рд╡рд╛рд▓реЛрдВ / рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ / рд╕реБрдЭрд╛рд╡реЛрдВ, рдкреНрд░рд┐рдп рдлреЗрд░реАрд╡рд╛рд▓реЛрдВ рдХреЛ рдЦрд┐рд▓рд╛рдПрдЧрд╛ред
рдЗрд╕ рдмреАрдЪ, рдореИрдВ рдлреНрд░реИрдВрдЪрд▓реА рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрдд рдХреЛ
рдмрд╛рд╣рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, -
рдлрдВрдбрд╛рдореЗрдВрдЯрд▓ рдХрд╛ рдкрд╣рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ред рд▓реЗрдЦ рдХрд╛рдлреА рд╣рдж рддрдХ C ++ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рд▓реЙрдХ-рдлрд╝реНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд░рдорд╛рдгреБ рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдмрд┐рдирд╛ рдЗрдирдСрдкрд░реЗрдЯрд┐рд╡ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдкрд░рдорд╛рдгреБ рдкреНрд░рд┐рдорд┐рдЯрд┐рд╡ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдРрд╕реЗ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдореВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВред
рдкрд░рдорд╛рдгреБрд╡рд╛рдж
рдирд░рдХ рдХрд╛ рдкрд╣рд▓рд╛
рдЪрдХреНрд░ рд╣реИ, рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдХрдоред
рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕рд░рд▓ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ - рдФрд░ рдкрд░рдорд╛рдгреБ рдкрд░рд┐рд╡рд░реНрддрди рд╕рдВрдЪрд╛рд▓рди (рд░реАрдб-рд╕рдВрд╢реЛрдзрд┐рдд-рд░рд╛рдЗрдЯ, рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ)ред рдПрдХ рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдХреЛ рдПрдХ рдЕрд╡рд┐рднрд╛рдЬреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдпрд╣ рдпрд╛ рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реБрдЖ рд╣реИ рдпрд╛ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реИ; рд╣рдо рдЗрд╕рдХреЗ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдХреЛрдИ рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдг, рдХреЛрдИ рдЖрдВрд╢рд┐рдХ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, рд╕рд░рд▓ рд░реВрдк рд╕реЗ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рдВрдЪрд╛рд▓рди, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкрд░рдорд╛рдгреБ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдкрдврд╝рдирд╛ рдЧреИрд░-рдкрд░рдорд╛рдгреБ рд╣реИ: x86 рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрдврд╝рдиреЗ рд╕реЗ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛, рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛, рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рд╕реНрдкрд╛рд░реНрдХ, рдЗрдВрдЯреЗрд▓ рдЗрдЯреЗрдирд┐рдпрдо) рдореЗрдВ - рдПрдХ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐ (рд╡рд┐рднрд╛рдЬрди рджреЛрд╖), рдЬреЛ, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкрдХрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣рд╛рдБ рдкрд░рдорд╛рдгреБ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП / рд▓рд┐рдЦрдиреЗ рдХреА рдкрд░рдорд╛рдгреБрддрд╛ рдХреЛ рдПрдХреАрдХреГрдд рдЕрднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ - рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рд╕рдВрдХреЗрдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВред рдЖрдзреБрдирд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЪрд░ рдХреЗ рд╕рд╣реА рд╕рдВрд░реЗрдЦрдг рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдЕрд▓рд┐рдЦрд┐рдд рдХреЙрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реЗ рдХреЗ рд▓рд┐рдП, рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдВрд░рдЪрдирд╛ (рдЖрдХрд╛рд░ рдореЗрдВ 4-8 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдлрд┐рдЯ) рдХреЗ рд╕рд╛рде рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ (рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЙрдЪрд┐рдд рд╕рдВрд░реЗрдЦрдг рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрдЯрд╛ / рдкреНрд░рдХрд╛рд░ рд╕рдВрд░реЗрдЦрдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреВрдареЗ рддрд░реАрдХреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ)ред рд╡реИрд╕реЗ,
libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдХрд╛рд░ рдФрд░ рдореИрдХреНрд░реЛ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдбреЗрдЯрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╕рдордп рд╕рдВрдХрд▓рдХ-рдирд┐рд░реНрднрд░ рднрд╛рдЧ рдХреЛ рдЫрд┐рдкрд╛рддрд╛ рд╣реИред
рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдФрд░ рд╕реНрд╡реИрдк
рд▓реЙрдХ-рдореБрдХреНрдд рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рддреЛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ (рдореИрдВ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдереНрд░реЗрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛)ред рдЗрд╕рд▓рд┐рдП, рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рдСрдкрд░реЗрд╢рдВрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдореЗрдореЛрд░реА рд╕реЗрд▓ рдХреЛ рдкрдврд╝ рдФрд░ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ: рддреБрд▓рдирд╛-рдФрд░-рд╕реНрд╡реИрдк (рдХреИрд╕), рд▓рд╛рдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ (рдПрдлрдПрдП), рдкрд░реАрдХреНрд╖рдг-рдФрд░-рд╕реЗрдЯ (рдЯреАрдПрдПрд╕), рдЖрджрд┐ред рд╢реИрдХреНрд╖рдгрд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рддреБрд▓рдирд╛-рдФрд░-рд╕реНрд╡реИрдк (CAS) рдСрдкрд░реЗрд╢рди рдХреЛ рдмреБрдирд┐рдпрд╛рджреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЙрд╕рдХрд╛ рдЫрджреНрдо рдХреЛрдб рд╕рд░рд▓ рд╣реИ:
bool CAS( int * pAddr, int nExpected, int nNew ) atomically { if ( *pAddr == nExpected ) { *pAddr = nNew ; return true ; } else return false ; }
рд╢рдмреНрджреЛрдВ рдореЗрдВ: рдпрджрд┐
pAddr
рдкрд░ рдЪрд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдорд╛рди
pAddr
рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдЪрд░ рдХреЛ
nNew
рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░
true
рд▓реМрдЯреЗрдВ, рдЕрдиреНрдпрдерд╛
false
рд╡рд╛рдкрд╕ рдЖрдП, рдЪрд░ рдХрд╛ рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ, рдЕрд░реНрдерд╛рддреН рдЕрд╡рд┐рднрд╛рдЬреНрдп рдФрд░ рджреГрд╢реНрдпрдорд╛рди рдЖрдВрд╢рд┐рдХ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реАрдПрдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк рдЕрдиреНрдп рд╕рднреА рдЖрд░рдПрдордбрдмреНрд▓реНрдпреВ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХрд╛рдо рд╣реЛрдЧрд╛:
int FAA( int * pAddr, int nIncr ) { int ncur ; do { ncur = *pAddr ; } while ( !CAS( pAddr, ncur, ncur + nIncr ) ; return ncur ; }
рдХреИрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ "рд╢реИрдХреНрд╖рдгрд┐рдХ" рд╕рдВрд╕реНрдХрд░рдг рд╣рдореЗрд╢рд╛ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдХреНрд╕рд░ рдЬрдм рдХреИрд╕ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕ рдмрд╛рдд рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЗрд▓ рдореЗрдВ рдЕрдм рдХреНрдпрд╛ рдореВрд▓реНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХреИрд╕ рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЕрдХреНрд╕рд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рддрдерд╛рдХрдерд┐рдд
рдореВрд▓реНрдпрд╡рд╛рди рдХреИрд╕ , рдЬрд┐рд╕реЗ рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ):
int CAS( int * pAddr, int nExpected, int nNew ) atomically { if ( *pAddr == nExpected ) { *pAddr = nNew ; return nExpected ; } else return *pAddr }
C ++ 11 рдореЗрдВ,
compare_exchange
рдлрд╝рдВрдХреНрд╢рди (рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓ рд░рд╣рд╛ рд╣реИ, C ++ 11 рдореЗрдВ рдРрд╕рд╛ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреА рдХрд┐рд╕реНрдореЗрдВ
compare_exchange_strong
рдФрд░
compare_exchange_weak
, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛) рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
bool compare_exchange( int volatile * pAddr, int& nExpected, int nNew );
nExpected
рддрд░реНрдХ
nExpected
рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рдореЗрдВ
pAddr
рдкрд░ рдЪрд░ рдХрд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рдлрд▓рддрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ: рдпрд╣
true
, рдпрджрд┐ рдкрддреЗ рдореЗрдВ
nExpected
рдХрд╛ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣
nNew
рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдпрджрд┐ рдпрд╣ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рддрдм
nExpected
рдкрд░ рдЪрд░ рдХрд╛ рд╡рд░реНрддрдорд╛рди рдорд╛рди рд╣реЛрдЧрд╛)ред рдХреИрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдРрд╕рд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд┐рд░реНрдорд╛рдг рдХреИрд╕ рдХреА "рдЕрдХрд╛рджрдорд┐рдХ" рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ,
compare_exchange
рдЙрдкрдпреЛрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐
nExpected
рддрд░реНрдХ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрд╢рд╛ рд╕реНрд╡реАрдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
compare_exchange
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ
compare_exchange
рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛
compare_exchange
-рдФрд░-рдРрдб рдЖрджрд┐рдо рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
int FAA( int * pAddr, int nIncr ) { int ncur = *pAddr; do {} while ( !compare_exchange( pAddr, ncur, ncur + nIncr ) ; return ncur ; }
ABA рд╕рдорд╕реНрдпрд╛
CAS рдЖрджрд┐рдо рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рд╕реЗ
ABA рд╕рдорд╕реНрдпрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛
рд╣реИ ред рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ CAS рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЯрд░реНрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
int nCur = *pAddr ; while (true) { int nNew = if ( compare_exchange( pAddr, nCur, nNew )) break; }
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдХреИрд╕ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рддрдХ рд▓реВрдк рдореЗрдВ "рдмреИрдВрдЧ" рдХрд░рддреЗ рд╣реИрдВ; рд▓реВрдк рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
pAddr
рдкрд░ рдПрдХ рдЪрд░ рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдПрдХ рдирдП рдореВрд▓реНрдп
nNew
рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ
nNew
pAddr
рдкрд░
nNew
рдЪрд░ рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

ABA рд╕рдорд╕реНрдпрд╛ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдорд╛рди рд▓реЗрдВ рдХрд┐ рдереНрд░реЗрдб X рдХреБрдЫ рд╕рд╛рдЭрд╛ рд╕реЗрд▓ рд╕реЗ A рдХрд╛ рдорд╛рди рдмрддрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИред рдлрд┐рд░ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛, рд╡рд╛рдИ, рдЗрд╕ рд╕реЗрд▓ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмреА рдФрд░ рдлрд┐рд░ рд╕реЗ рдП рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╕реВрдЪрдХ рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдереНрд░реЗрдб рдПрдХреНрд╕, рдХреИрд╕ рдЖрджрд┐рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕реЗрд▓ рд╡реИрд▓реНрдпреВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреЙрдЗрдВрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдП рдХреЗ рдкрд┐рдЫрд▓реЗ (рдкрдврд╝реЗ) рдорд╛рди рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдХреИрд╕ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдП рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ! рдирддреАрдЬрддрди, рдкреНрд░рд╡рд╛рд╣ рд╡рд╕реНрддреБ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдкрддрди рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИ)ред
рдпрд╣рд╛рдБ рдПрдХ рд▓реЙрдХ-рдлреНрд░реА рд╕реНрдЯреИрдХ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ ABA рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЧреНрд░рд╕реНрдд рд╣реИ [Mic04]:
// Shared variables static NodeType * Top = NULL; // Initially null Push(NodeType * node) { do { NodeType * t = Top; node->Next = t; } while ( !CAS(&Top,t,node) ); } NodeType * Pop() { Node * next ; do { NodeType * t = Top; if ( t == null ) return null; next = t->Next; } while ( !CAS(&Top,t,next) ); return t; }
рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕реНрдЯреИрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрддрд╛ рд╣реИ (рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рдХреНрд░рдо ABA рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХрдорд╛рддреНрд░ рдирд╣реАрдВ рд╣реИ):
рдереНрд░реЗрдб рдПрдХреНрд╕ | рдереНрд░реЗрдб рд╡рд╛рдИ |
Pop() рдХреЙрд▓ Pop() ред рд╣реЛ рдЧрдпрд╛ рд▓рд╛рдЗрди Pop4 , рдЪрд░ рдорд╛рди: t == A
next == A->next
| |
|
NodeType * pTop = Pop()
pTop == рдвреЗрд░ рдХреЗ рдКрдкрд░, рдЕрд░реНрдерд╛рддреН рдП
Pop()
Push( pTop ) рдЕрдм рдвреЗрд░ рдХрд╛ рд╢реАрд░реНрд╖ рдлрд┐рд░ рд╕реЗ рдП рд╣реИ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ A->next рдмрджрд▓ рдЧрдпрд╛ рд╣реИ
|
рд▓рд╛рдЗрди Pop5 ред рдХреИрд╕ рд╕рдлрд▓ рд╣реИ, рд▓реЗрдХрд┐рди Top->next рдХреНрд╖реЗрддреНрд░ рд╣реИ рдХрд╛ рдорд╛рди рджрд┐рдпрд╛ рд╕реНрдЯреИрдХ рдкрд░ рдХреЛрдИ рдирд╣реАрдВ рдереНрд░реЗрдб рд╡рд╛рдИ рдХреЗ рдмрд╛рдж рд╕реЗ рд╕реНрдЯреИрдХ рдП рдФрд░ A->next , рдФрд░ рд╕реНрдерд╛рдиреАрдп рдЪрд░ next рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп A->next рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ
| |
рдПрдмреАрдП рд╕рдорд╕реНрдпрд╛ рдХреИрд╕ рдЖрджрд┐рдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╕рднреА рд▓реЙрдХ-рдлреНрд░реА рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рд╕рдВрдХрдЯ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдХрдВрдЯреЗрдирд░ рд╕реЗ рддрддреНрд╡ рдП рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рджреВрд╕рд░реЗ (рдмреА) рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдП рдХреЗ рд╕рд╛рде (рдЗрд╕рд▓рд┐рдП рдирд╛рдо "
рдПрдмреАрдП рд╕рдорд╕реНрдпрд╛"), рдЬрдмрдХрд┐ рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд░рдЦрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдХреЛрдИ рдереНрд░реЗрдб рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдП (
delete A
) рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдирдпрд╛ рдПрд▓рд┐рдореЗрдВрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрд▓реЛрдХреЗрдЯрд░ рдПрдбреНрд░реЗрд╕ рдП рдирд╣реАрдВ рд▓реМрдЯрд╛рдПрдЧрд╛ (рдЕрдЪреНрдЫреЗ рдПрд▓реЛрдХреЗрдЯрд░реНрд╕ рдмрд╕ рдпрд╣реА рдХрд░реЗрдВрдЧреЗ)ред рдЕрдХреНрд╕рд░ рдпрд╣ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдкрд░рд┐рд╖реНрдХреГрдд рддрд░реАрдХреЗ рд╕реЗ рдЦреБрдж рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ, рджреЛ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдкреНрд░рд╡рд╛рд╣ (рдЗрд╕ рдЕрд░реНрде рдореЗрдВ, рд╣рдо рдПрдмреАрд╕реАрдмреАрдП рд╕рдорд╕реНрдпрд╛, рдПрдмреАрдПрдмреАрдП рд╕рдорд╕реНрдпрд╛, рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдХрд▓реНрдкрдирд╛ рд╣реИ), рдФрд░ рдЗрд╕рдХреА рдкрд╣рдЪрд╛рди рд╣рдореЗрд╢рд╛ рдПрдХ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИред ред рдПрдмреАрдП рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЙрд╕ рд╕рдордп
рдХрд┐рд╕реА рддрддреНрд╡
рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд┐рдкрдЯрд╛рди, рдпрд╛
рд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рд░рд┐рдХреНрд▓реЗрдореЗрд╢рди рд╣реИ, рдЬрдм рдЗрд╕ рдмрд╛рдд рдХреА рдкреВрд░реА рдЧрд╛рд░рдВрдЯреА рд╣реЛ рдХрд┐ рдХреЛрдИ рднреА (рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХреЗ рдХрд┐рд╕реА рднреА рд╕реВрддреНрд░) рдХреЛ рд╣рдЯрд╛рдП рдЧрдП рддрддреНрд╡ рдХрд╛ рдХреЛрдИ рд╕реНрдерд╛рдиреАрдп рдпрд╛ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рддрддреНрд╡ рдХреЛ рд▓реЙрдХ-рдлреНрд░реА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рд╣рдЯрд╛рдирд╛ рджреЛ-рдЪрд░рдг рд╣реИ:
- рдкрд╣рд▓рд╛ рдЪрд░рдг рддрд╛рд▓рд╛-рдореБрдХреНрдд рдХрдВрдЯреЗрдирд░ рд╕реЗ рдПрдХ рддрддреНрд╡ рдХрд╛ рдмрд╣рд┐рд╖реНрдХрд░рдг рд╣реИ;
- рджреВрд╕рд░рд╛ рдЪрд░рдг (рдЖрд╕реНрдердЧрд┐рдд) рдХрд┐рд╕реА рддрддреНрд╡ рдХрд╛ рднреМрддрд┐рдХ рдирд┐рд╖реНрдХрд╛рд╕рди рд╣реИ рдЬрдм рдЗрд╕рдХрд╛ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЖрд╕реНрдердЧрд┐рдд рд╡рд┐рд▓реЛрдкрди рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред
рд▓реЛрдб-рд▓рд┐рдВрдХреНрдб / рд╕реНрдЯреЛрд░-рдХрдВрдбрд┐рд╢рдирд▓
рд╕рдВрднрд╡рддрдГ, рдЬрдм ABA рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп RMW рдкреНрд░рдЪрд╛рд▓рдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХреЗ рд▓рд┐рдП CAS рдбрд┐рдЬрд╝рд╛рдЗрдирд░реЛрдВ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CAS рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рддреЗ рд╕рдордп ABA рд╕рдорд╕реНрдпрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИред рдФрд░ рдРрд╕реЗ рдСрдкрд░реЗрд╢рди рдкрд╛рдП рдЧрдП -
рд▓реЛрдб-рд▓рд┐рдВрдХреНрдб / рд╕реНрдЯреЛрд░-рд╕рд╢рд░реНрдд (рдПрд▓рдПрд▓ / рдПрд╕рд╕реА) рдХреА рдПрдХ рдЬреЛрдбрд╝реАред рдпреЗ рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ - рдпрд╣рд╛рдБ рдЙрдирдХрд╛ рдЫрджреНрдо рдХреЛрдб рд╣реИ:
word LL( word * pAddr ) { return *pAddr ; } bool SC( word * pAddr, word New ) { if ( pAddr LL) { *pAddr = New ; return true ; } else return false ; }
LL / SC рдЬреЛрдбрд╝реА рдСрдкрд░реЗрдЯрд░ рдХреЛрд╖реНрдардХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рд▓реЛрдб-рд▓рд┐рдВрдХреНрдб (рдПрд▓рдПрд▓) рдСрдкрд░реЗрд╢рди рдХреЗрд╡рд▓ рдЪрд░ рдХреЗ рдореМрдЬреВрджрд╛ рдореВрд▓реНрдп рдХреЛ
pAddr
рдкрд░
pAddr
ред
рд╕реНрдЯреЛрд░-рд╕рд╢рд░реНрдд (рдПрд╕рд╕реА) рдСрдкрд░реЗрд╢рди рдкрд╣рд▓реЗ рд╕реЗ рдкрдврд╝реЗ рдЧрдП рдПрд▓рдПрд▓ рдСрдкрд░реЗрд╢рди рдкрддреЗ
pAddr
рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ рдХреЗрд╡рд▓ рдЕрдЧрд░
pAddr
рдореЗрдВ рдбреЗрдЯрд╛
pAddr
рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ рдЬрдм рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди
рдХреИрд╢ рд▓рд╛рдЗрди рдХреЗ рдХрд┐рд╕реА рднреА рд╕рдВрд╢реЛрдзрди рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ
pAddr
рдкрддрд╛
pAddr
ред рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдЬреЛрдбрд╝реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрд╕реЗрд╕рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдХреИрд╢ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛: рдореЛрдЯреЗ рддреМрд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдХреИрд╢ рд▓рд╛рдЗрди рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реНрдерд┐рддрд┐ рдмрд┐рдЯ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЬрдм рдПрд▓рдПрд▓ рдСрдкрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдмрд┐рдЯ рд╕реЗрдЯ (рд▓рд┐рдВрдХ) рд╣реЛрддрд╛ рд╣реИ, рдХреЛрдИ рднреА рдХреИрд╢ рд▓рд╛рдЗрди рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ (рдпрд╛ рдЗрд╕реЗ рдХреИрд╢ рд╕реЗ рдмрд╛рд╣рд░ рдзрдХреЗрд▓рддрд╛ рд╣реИ) рдмрд┐рдЯ рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрд╕рд╕реА рдСрдкрд░реЗрд╢рди рдЪреЗрдХ рдХреЛ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдмрд┐рдЯ рдХреИрд╢ рд▓рд╛рдЗрди рдкрд░ рд╕реЗрдЯ рд╣реИ рдпрд╛ рдирд╣реАрдВ - рдпрджрд┐ рдмрд┐рдЯ = 1, рддреЛ рдХреИрд╢ рд▓рд╛рдЗрди рдХреЛ рдХрд┐рд╕реА рдиреЗ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ,
pAddr
рдкрд░ рдорд╛рди рдХреЛ рдПрдХ рдирдП
pAddr
рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ SC рдСрдкрд░реЗрд╢рди рд╕рдлрд▓ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдСрдкрд░реЗрд╢рди рдЕрд╕рдлрд▓ рд╣реИ,
pAddr
рдкрд░ рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
CAS рдЖрджрд┐рдо рдХреЛ LL / SC рдЬреЛрдбрд╝реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
bool CAS( word * pAddr, word nExpected, word nNew ) { if ( LL( pAddr ) == nExpected ) return SC( pAddr, nNew ) ; return false ; }
рдзреНрдпрд╛рди рджреЗрдВ, рдЗрд╕ рдХреЛрдб рдХреА рдмрд╣реБ-рдЪрд░рдг рдкреНрд░рдХреГрддрд┐ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдпрд╣ рдкрд░рдорд╛рдгреБ рдХреИрд╕ рдХрд░рддрд╛ рд╣реИ: рд▓рдХреНрд╖реНрдп рдореЗрдореЛрд░реА рд╕реЗрд▓ рдХреА рд╕рд╛рдордЧреНрд░реА рдпрд╛ рддреЛ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ рдпрд╛
рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдмрджрд▓рддреА рд╣реИред рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдПрдХ рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдЬреЛрдбрд╝реА рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЬреЛ рдХреЗрд╡рд▓ рдХреИрд╕ рдЖрджрд┐рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрджрд┐рдо рд╣реЛ; рдореИрдВ рдпрд╣рд╛рдБ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛; рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ [рдорд╛рдЗрдХ режрек] рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рджреЛ рдмрдбрд╝реЗ рд╢рд┐рд╡рд┐рд░реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдХреБрдЫ рдЕрдкрдиреЗ рдХрдорд╛рдВрдб рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреИрд╕ рдЖрджрд┐рдо рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдп рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред CAS рдХреЛ x86, Intel Itanium, Sparc рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдЖрджрд┐рдо рдкрд╣рд▓реА рдмрд╛рд░ рдЖрдИрдмреАрдПрдо рд╕рд┐рд╕реНрдЯрдо 370 рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдЬреЛрдбрд╝реА рдкрд╛рд╡рд░рдкреАрд╕реА, рдПрдордЖрдЗрдкреА, рдЕрд▓реНрдлрд╛, рдПрдЖрд░рдПрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рд╣реИ; рдкрд╣рд▓реЗ DEC рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рддред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдзреБрдирд┐рдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдЖрджрд┐рдо рдХреЛ рд╕рдмрд╕реЗ рдЖрджрд░реНрд╢ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрддреЗ рдХреЗ рд╕рд╛рде рдиреЗрд╕реНрдЯреЗрдб рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓рд┐рдВрдХ рдХрд┐рдП рдЧрдП рдЭрдВрдбреЗ рдХрд╛ рдЧрд▓рдд рд░реАрд╕реЗрдЯ рд╕рдВрднрд╡ рд╣реИ (рддрдерд╛рдХрдерд┐рдд рдЧрд▓рдд рд╕рд╛рдЭрд╛рдХрд░рдг, рдиреАрдЪреЗ рджреЗрдЦреЗрдВ), рдХреЛрдИ рдзреНрд╡рдЬ рд╕рддреНрдпрд╛рдкрди рдЖрджрд┐рдо рдирд╣реАрдВ рд╣реИ LL / SC рдЬреЛрдбрд╝реА рдХреЗ рдЕрдВрджрд░ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
C ++ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ, C ++ 11 рдорд╛рдирдХ LL / SC рдЬреЛрдбрд╝реА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдкрд░рдорд╛рдгреБ
compare_exchange
(CAS) рдФрд░ рдЙрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ -
fetch_add
,
fetch_sub
,
exchange
, рдЖрджрд┐ред рдорд╛рдирдХ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк LL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ CAS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред / SC рдмрд╣реБрдд рд╕реАрдзрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд┐рд╡рд░реНрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди - LL / SC рдХреИрд╕ тАЛтАЛрдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ - рдХрд╛рдлреА рдЕрдиреБрддреНрддрд░рджрд╛рдпреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдорд╛рдирдХ C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЬреАрд╡рди рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, C ++ рдореЗрдВ рд╢реБрд░реВ рдХреА рдЧрдИ рдорд╛рдирдХреАрдХрд░рдг рд╕рдорд┐рддрд┐ рдХреЗрд╡рд▓
compare_exchange
, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдЧрд▓рдд рдмрдВрдЯрд╡рд╛рд░рд╛
рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ, рдПрд▓ рдХреИрд╢ (рдХреИрд╢ рд▓рд╛рдЗрди) рдХреА рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ 64 - 128 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрддреА рд╣реИ рдФрд░ рдирдП рдореЙрдбрд▓ рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реЛрддреА рд╣реИред рдореБрдЦреНрдп рдореЗрдореЛрд░реА рдФрд░ рдХреИрд╢ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдПрд▓ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ рдПрд▓ рджреЛ рдХреА рд╢рдХреНрддрд┐ рд╣реИ)ред рдпрджрд┐ рдХреИрд╢ рд▓рд╛рдЗрди рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рдЗрдЯ рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреВрд░реА рд▓рд╛рдЗрди рдХреЛ рдЕрдорд╛рдиреНрдп рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдорд▓реНрдЯреА-рдкреНрд░реЛрд╕реЗрд╕рд░ / рдорд▓реНрдЯреА-рдХреЛрд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдХреИрд╢ рд╕реБрд╕рдВрдЧрддрд┐ рд╕рдорд░реНрдерди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
MESI рдХреИрд╢ рдХреЛрд╣рд░реЗрдВрд╕ рд╕рдкреЛрд░реНрдЯ рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП ([Cha05]), рдЗрдВрдЯреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЬреБрдЯрдиреЗ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП MESI рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (рд╕рдВрд╢реЛрдзрд┐рдд - рдЕрдирдиреНрдп - рд╕рд╛рдЭрд╛ - рдЕрдорд╛рдиреНрдп) рдХреИрд╢ рд▓рд╛рдЗрди рдХреЛ рд╕рд╛рдЭрд╛ рд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдорд╛рдиреНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЧрд╣рди рдореЗрдореЛрд░реА рдПрдХреНрд╕рдЪреЗрдВрдЬ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рдХреИрд╢ рд▓рд╛рдЗрди рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, MESI рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ E (рдЕрдирдиреНрдп) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХреИрд╢ рд▓рд╛рдЗрди рдкрд░ рдбреЗрдЯрд╛ рдХреА рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд░реАрдб / рд░рд╛рдЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдЙрд╕реА рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЗрд╕ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдХреИрд╢ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рддреЛ MESI рдХреИрд╢ рд▓рд╛рдЗрди рдХреЛ S (рд╢рд╛рд░реНрдк) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдм, рдХрд┐рд╕реА рднреА рдХреИрд╢ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд▓рд╛рдЗрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рдирд┐рд░реНрджреЗрд╢ рд▓рд╛рдЗрди рдХреЛ M (рд╕рдВрд╢реЛрдзрд┐рдд) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдХреИрд╢ рдореЗрдВ I (рдЕрдорд╛рдиреНрдп) рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЦреНрдп рдореЗрдореЛрд░реА рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИред ред рдЕрдм рдореИрдВ MESI рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреЛрдЯреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╕рдВрдЧрдарди рдкрд░ рдПрдХ рдЕрджреНрднреБрдд рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ MESI рдкрд░ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдЧрд╛ред

рдпрджрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдПрдХ рдХреИрд╢реЗ рд▓рд╛рдЗрди рдореЗрдВ рдЖрддреЗ рд╣реИрдВ (рдпрд╛рдиреА, рд╡реЗ рдЖрд╕-рдкрд╛рд╕ рдХреЗ рдкрддреЗ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ), рддреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдПрдХ рд╣реА рдХреИрд╢реЗ рд▓рд╛рдЗрди рдореЗрдВ рд╕реНрдерд┐рдд рдЕрдиреНрдп рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбреЗрдЯрд╛ рд▓реАрдб рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ
рдЭреВрдареА рд╕рд╛рдЭрд╛рдХрд░рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред LL / SC рдЖрджрд┐рдорд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдЭреВрдареА рд╕рд╛рдЭрд╛рдХрд░рдг рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЛ рдХреИрд╢ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд▓реЛрдб-рд▓рд┐рдВрдХреНрдб рдСрдкрд░реЗрд╢рди рдХреИрд╢ рд▓рд╛рдЗрди (рд▓рд┐рдВрдХ) рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрдЯреЛрд░-рдХрдВрдбреАрд╢рдирд▓ рдСрдкрд░реЗрд╢рди рдЪреЗрдХ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рд▓рд╛рдЗрди рдХрд╛ рд▓рд┐рдВрдХ рдлреНрд▓реИрдЧ рдХреНрд▓рд┐рдпрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ; рдпрджрд┐ рдзреНрд╡рдЬ рд╕рд╛рдлрд╝ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХреЛрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ SC рдЧрд▓рдд рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЪреВрдВрдХрд┐ рдПрд▓ рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрд╕рд╕реА рдЖрджрд┐рдо (рдпрд╛рдиреА рд▓рд┐рдВрдХ рдлреНрд▓реИрдЧ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдирд╛) рдХреА рдПрдХ рдЭреВрдареА
рд╡рд┐рдлрд▓рддрд╛ рдХреИрд╢ рд▓рд╛рдЗрди рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ рдЬреЛ рд▓рдХреНрд╖реНрдп рдбреЗрдЯрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдирддреАрдЬрддрди, рд╣рдо
рд▓рд╛рдЗрд╡рд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЬрд╣рд╛рдВ рдкреНрд░реЛрд╕реЗрд╕рд░ / рдХреЛрд░ 100% рд╡реНрдпрд╕реНрдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдкреНрд░рдЧрддрд┐ рдирд╣реАрдВ рд╣реИред
рдЭреВрдареА рд╕рд╛рдЭрд╛рдХрд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдбрд╝рд╛рдИ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ (рд▓реЗрдХрд┐рди рдмреЗрдХрд╛рд░): рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдЭрд╛ рдЪрд░ рдХреЛ рдкреВрд░реА рдХреИрд╢ рд▓рд╛рдЗрди рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП; рдЗрд╕рдХреЗ рд▓рд┐рдП, рдкреИрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
struct Foo { int volatile nShared1; char _padding1[64]; // padding for cache line=64 byte int volatile nShared2; char _padding2[64]; // padding for cache line=64 byte };
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреИрд╢ рдХреА рднреМрддрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ (рд╕реАрдПрдПрд╕ рд╕рд╣рд┐рдд) рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреА рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрд▓рдПрд▓ / рдПрд╕рд╕реА рдЖрджрд┐рдоред рдХреБрдЫ рдХрд╛рд░реНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХреИрд╢ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдирд┐рд░реНрдорд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдореБрдЦреНрдп рд░реВрдк рд╕реЗ, рдХреИрд╢ рд▓рд╛рдЗрди рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП); рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╣реА ("рдХреИрд╢ рдХреЗ рддрд╣рдд") рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде, рдЙрддреНрдкрд╛рджрдХрддрд╛ рдПрдХ рдкрд░рд┐рдорд╛рдг рдХреЗ рдХреНрд░рдо рд╕реЗ рдмрдврд╝ рд╕рдХрддреА рд╣реИред
рдХрд┐рд╕реНрдо рдХреЗ рдХреИрд╕
рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рджреЛ рдФрд░ рдЙрдкрдпреЛрдЧреА рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо -
рдХреИрд╕ рдбрдмрд▓ рдЪреМрдбрд╝рд╛рдИ (рдбрдмрд▓-рд╡рд░реНрдб рдХреИрд╕, dwCAS) рдФрд░
рдбрдмрд▓ рдХреИрд╕ (DCAS) рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред
рдбрдмрд▓-рдЪреМрдбрд╝рд╛рдИ рдХреИрд╕ рдирд┐рдпрдорд┐рдд рд╕реАрдПрдПрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдбрдмрд▓-рдмрд┐рдЯ рдореЗрдореЛрд░реА рд╕реЗрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ: 64-рдмрд┐рдЯ 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдФрд░ 128-рдмрд┐рдЯ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдХрдо рд╕реЗ рдХрдо 96-рдмрд┐рдЯ) рдХреЗ рд▓рд┐рдП 64-рдмрд┐рдЯред рдРрд╕реЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ CAS рдХреЗ рдмрдЬрд╛рдп LL / SC рдХреА рдЬреЛрдбрд╝реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, LL / SC рдХреЛ рдбрдмрд▓-рд▓реЗрдВрде рд╢рдмреНрджреЛрдВ рдкрд░ рднреА рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, рдХреЗрд╡рд▓ x86 dwCAS рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрджрд┐рдо рдЗрддрдирд╛ рдЙрдкрдпреЛрдЧреА рдХреНрдпреЛрдВ рд╣реИ? рдпрд╣ рдЖрдкрдХреЛ ABA рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реА рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ -
рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдХреЗрдд ред рдпрд╣ рдпреЛрдЬрдирд╛ рдЖрдИрдмреАрдПрдо рдиреЗ рдПрдмреАрдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХреА рдереА рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдЯреИрдЧ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд┐рд▓рд╛рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдереА; рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╕реВрдЪрдХ рдХреЛ рдирд┐рдореНрди рд╕рдВрд░рдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
template <typename T> struct tagged_pointer { T * ptr ; uintptr_t tag ; tagged_pointer() : ptr( new T ) , tag( 1 ) {} };
рдкрд░рдорд╛рдгреБрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдбрдмрд▓-рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП: 32-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП 8 рдмрд╛рдЗрдЯ рдФрд░ 64-рдмрд┐рдЯ рдХреЗ рд▓рд┐рдП 16 рдмрд╛рдЗрдЯреНрд╕ред рдЯреИрдЧ рдореЗрдВ
ptr
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдбреЗрдЯрд╛ рдХрд╛ "рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛" рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рд░рд┐рдХреНрд▓реЗрдореЗрд╢рди (SMR) рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛ рдХрд┐ рдЯреИрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдХреЗрдд рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк рдЯреА рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЧрдИ рдореЗрдореЛрд░реА (рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд
tagged_pointer
) рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдирд╖реНрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (
delete
), рд▓реЗрдХрд┐рди рдПрдХ рдореБрдХреНрдд-рд╕реВрдЪреА (рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреА рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ) рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЯреИрдЧ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдПрдмреАрдП рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рджреЗрддрд╛ рд╣реИ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реВрдЪрдХ рд╕рдордЧреНрд░ рд╣реИ рдФрд░ рдЯреИрдЧ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ (рд╡рд┐рддрд░рдг рдХреА рдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛) рд╢рд╛рдорд┐рд▓ рд╣реИ; рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, dwCAS рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдпрджрд┐ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреИрдЧ рдХрд┐рдП
tagged_pointer
рддрд░реНрдХ рд╕рдорд╛рди
tagged_pointer
рдФрд░ рдЯреИрдЧ рдорд╛рди рднрд┐рдиреНрди рд╣реИрдВред
рджреВрд╕рд░рд╛ рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо -
рдбрдмрд▓ рдХреИрд╕ (DCAS) - рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдЖрдзреБрдирд┐рдХ рддрдХрдиреАрдХреА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред DCAS рдЫрджреНрдо рдХреЛрдб рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
bool DCAS( int * pAddr1, int nExpected1, int nNew1, int * pAddr2, int nExpected2, int nNew2 ) atomically { if ( *pAddr1 == nExpected1 && *pAddr2 == nExpected2 ) { *pAddr1 = nNew1 ; *pAddr2 = nNew2 ; return true ; } else return false }
рдбреАрд╕реАрдПрдПрд╕ рджреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдореЗрдореЛрд░реА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдорд╛рди рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВред
рдпрд╣ рдЖрджрд┐рдо рдЗрддрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрдпреЛрдВ рд╣реИ? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рдПрдХ рд▓реЙрдХ-рдлреНрд░реА рдбрдмрд▓рд▓реА рд▓рд┐рдВрдХреНрдб рд▓рд┐рд╕реНрдЯ (deque, рдбрдмрд▓-рд▓рд┐рдВрдХреНрдб рд▓рд┐рд╕реНрдЯ) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ, рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЖрдзрд╛рд░ рд╣реИред рдбреАрд╕реАрдПрдПрд╕-рдЖрдзрд╛рд░рд┐рдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╢реИрдХреНрд╖рдгрд┐рдХ рдкреЗрдкрд░ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЖрджрд┐рдо "рд╣рд╛рд░реНрдбрд╡реЗрдпрд░" рдореЗрдВ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд╣рд╛рдБ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [Fra03] - рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз) рдЬреЛ DCAS рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ (рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдорд▓реНрдЯреА-рдХреИрд╕ рдХрд┐рддрдиреЗ
pAddr1
...
pAddrN
рдкрддреЗ
pAddrN
) рд╕рд╛рдорд╛рдиреНрдп рдХреИрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ред
рдЙрддреНрдкрд╛рджрдХрддрд╛

рдФрд░ рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдореЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЗрддрдиреЗ рдЬрдЯрд┐рд▓ рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╣реИрдВ рдХрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдХреБрдЫ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЕрд╡рдзрд┐ рдХреА рдХреЛрдИ рдирд┐рд╢реНрдЪрд┐рдд рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рдорд╛рдгреБ рд╡рд╛рд▓реЗ, рдЬрд┐рд╕рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рддреБрд▓реНрдпрдХрд╛рд▓рди, рдкреНрд░реЛрд╕реЗрд╕рд░ рдмрд╕реЛрдВ рдкрд░ рд╕рд┐рдЧреНрдирд▓рд┐рдВрдЧ рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕рдореЗрдВ рдХрд╛рдлреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрд╛рдо рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд▓реЗрдЦрдХ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдорд╛рдкреЗрдВред рдореИрдВ [McKen05] рд╕реЗ рдорд╛рдк рджреВрдВрдЧрд╛ред рдЗрд╕ рдХрд╛рдо рдореЗрдВ, рд▓реЗрдЦрдХ, рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ рдХреА рдЕрд╡рдзрд┐ рдФрд░ рдХреИрд╕ рдЖрджрд┐рдо рдХреА рддреБрд▓рдирд╛
nop
(рдиреЛ-рдСрдкрд░реЗрд╢рди) рдСрдкрд░реЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред рддреЛ, рдЗрдВрдЯреЗрд▓ Xeon 3.06 GHz (2005 рдирдореВрдирд╛) рдХреЗ рд▓рд┐рдП, рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ рдХреА рдЕрд╡рдзрд┐ 400 рдПрдирдУрдкреА, рдХреИрд╕ - 850 - 1000 рдПрдирдУрдкреА рд╣реИред рдЖрдИрдмреАрдПрдо рдкрд╛рд╡рд░ 4 рдкреНрд░реЛрд╕реЗрд╕рд░ 1.45 рдЧреАрдЧрд╛рд╣рд░реНрдЯреНрдЬ: рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП 180 рдПрдирдУрдкреА рдФрд░ рдХреИрд╕ рдХреЗ рд▓рд┐рдП 250 рдПрдирдУрдкреАред рдорд╛рдк рдХрд╛рдлреА рдкреБрд░рд╛рдиреЗ рд╣реИрдВ (2005), рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдиреЗ рдХреБрдЫ рдФрд░ рдХрджрдо рдЖрдЧреЗ рдмрдврд╝рд╛рдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд╡рд╣реА рдмрдирд╛ рд╣реБрдЖ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо рдмрд╣реБрдд рднрд╛рд░реА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рд╣рд░ рдЬрдЧрд╣ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдорд╣рдВрдЧрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рд╕рд░реНрдЪ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреИрд╕ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЯреНрд░реА рдиреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕реЗ рдХреБрдЫ рднреА рдЕрдЪреНрдЫрд╛ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИ (рдФрд░ рдореИрдВрдиреЗ рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рджреЗрдЦрд╛ рд╣реИ)ред рдирд┐рд╖реНрдкрдХреНрд╖рддрд╛ рдореЗрдВ, рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рдореЗрд░реА рднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЗрдВрдЯреЗрд▓ рдХреЛрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдирдИ рдкреАрдврд╝реА рдХреЗ рд╕рд╛рде, рд╕реАрдПрдПрд╕ рдЖрджрд┐рдо рддреЗрдЬреА рд╕реЗ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЗрдВрдЯреЗрд▓ рдЗрдВрдЬреАрдирд┐рдпрд░ рдорд╛рдЗрдХреНрд░реЛрдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдЕрд╕реНрдерд┐рд░ рдФрд░ рдкрд░рдорд╛рдгреБ
C ++ рдореЗрдВ рдХреНрд░рд┐рдкреНрдЯрд┐рдХ
volatile
рдХреАрд╡рд░реНрдб рд╣реИред рдХрднреА-рдХрднреА
volatile
рдкрд░рдорд╛рдгреБрддрд╛ рдФрд░ рдСрд░реНрдбрд░рд┐рдВрдЧ
volatile
рдЬреБрдбрд╝реА рд╣реЛрддреА рд╣реИ - рдпрд╣ рдЧрд▓рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХреБрдЫ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдг рд╣реИрдВред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
volatile
рдХреЗрд╡рд▓ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрдХрд▓рдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдХреИрд╢ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ (рд╕рдВрдХрд▓рдирдХрд░реНрддрд╛ рдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рдХрд░рдирд╛ рдкрд╕рдВрдж рд╣реИ: рдЕрдзрд┐рдХ рд░рдЬрд┐рд╕реНрдЯрд░, рд╡реЗ рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВ)ред рдЕрд░реНрдерд╛рдд, рд╡рд╛рд╖реНрдкрд╢реАрд▓ рдЪрд░ рдХреЛ рдкрдврд╝рдирд╛
рд╣рдореЗрд╢рд╛ рд╕реНрдореГрддрд┐ рд╕реЗ рдкрдврд╝рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рд╡рд╛рд╖реНрдкрд╢реАрд▓ рдЪрд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд░реНрде
рд╣рдореЗрд╢рд╛ рд╕реНрдореГрддрд┐ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХреЛрдИ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рддреБрд░рдВрдд рджреЗрдЦреЗрдВрдЧреЗред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рд╕реНрдореГрддрд┐ рдмрд╛рдзрд╛рдУрдВ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдгред рдХреБрдЫ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ (Java, C #)
volatile
рдПрдХ рдЬрд╛рджреБрдИ рд╕реНрдерд┐рддрд┐ рд╕реМрдВрдкреА рдЬрд╛рддреА рд╣реИ рдЬреЛ рдХреНрд░рдордмрджреНрдзрддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди C ++ 11 рдореЗрдВ рдирд╣реАрдВред рдФрд░
volatile
рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдВрд░реЗрдЦрдг рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЕрдм рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдбреЗрдЯрд╛ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдкрд░рдорд╛рдгреБрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд╢реНрдпрдХ рд╢рд░реНрдд рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, C ++ 11-рд╕рдВрдЧрдд рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП, рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреЗ рд▓рд┐рдП
volatile
рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред рд▓реЗрдХрд┐рди рдкреБрд░рд╛рдиреЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрднреА-рдХрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдЖрдк рд╕реНрд╡рдпрдВ
atomic
рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реЗ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдореЗрдВ:
class atomic_int { int m_nAtomic;
рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ
m_nAtomic
рдХреЛ "рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝" рдХрд░рдиреЗ рдХрд╛ рд╣рд░ рдЕрдзрд┐рдХрд╛рд░ рд╣реИ (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдХреЙрд▓ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ
this
рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП,
int volatile m_nAtomic
рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛
int volatile m_nAtomic
рд╣реЛрдЧрд╛ред
C ++ рдореЗрдВ рд╡рд╛рд╖реНрдкрд╢реАрд▓ рддрд░реАрдХреЗatomic
рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╕рдордп, рдЖрдк рд╢рд╛рдпрдж рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕рдХреЗ рдХрдИ рддрд░реАрдХреЛрдВ рдореЗрдВ рдПрдХ
volatile
рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рд╣реИ:
void store( T val ) volatile ;
рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдХреНрдпрд╛
this
рдкреЙрдЗрдВрдЯрд░
volatile
(рдпрд╛рдиреА, рдЯрд╛рдЗрдк
T * volatile
)? рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ -
this
рдЕрдХреНрд╕рд░ рдПрдХ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХреБрдЫ рдПрдмреАрдЖрдИ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИред рджрд░рдЕрд╕рд▓, рдпрд╣ рдЯрд╛рдЗрдк
T volatile *
ред
const
рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рд╕реЗ, рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯрдХрд░реНрддрд╛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐
this
рдЕрд╕реНрдерд┐рд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдРрд╕реА рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рднреА рд╕рджрд╕реНрдп рдбреЗрдЯрд╛
volatile
рд╣реИред рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рджрд╕реНрдп рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЕрд╕рд▓ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ
volatile
рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред
рдЦреИрд░, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐
const
рдФрд░
volatile
рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рд╡рд┐рд░реЛрдзреА рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдПрдХ рд╕рд╛рде рдореМрдЬреВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ
atomic<T>
рдореЗрдВ рдкрдарди рд╡рд┐рдзрд┐ рдХреА рдШреЛрд╖рдгрд╛ рд╣реИ:
T load() const volatile ;
:
const
тАФ -volatile
тАФ - - ,
libcds
рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд┐рдмрдХрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ x86 / amd64, Intel Itanium рдФрд░ Sparc рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП C ++ 11 рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо рдХрд╛ рдПрдХ рдФрд░ рдмрд╛рдЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдпрджрд┐ рд╕рдВрдХрд▓рдХ C ++ 11 рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рдХ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ - рдореЗрд░реЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдЬреАрд╕реАрд╕реА 4.7+, рдПрдордПрд╕ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реА ++ 2012, рдХреНрд▓реИрдВрдЧ 3.0+), рддреЛ рдпрд╣ libcds
рдкрд░рдорд╛рдгреБ рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рдХреНрд╕ рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдкрд░рдорд╛рдгреБ рд░реАрдб / рд░рд╛рдЗрдЯ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдореЗрдВ рдореБрдЦреНрдп рдкрд░рдорд╛рдгреБ рдЖрджрд┐рдо, рдХреИрд╕ рд╣реИ, рдмрд╣реБрдд рдХрдо рд╣реА рдЬрд╣рд╛рдВ рдХреИрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рджреЛрд╣рд░реЗ рд╢рдмреНрдж (dwCAS) рд╕реЗ рдЕрдзрд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред DCAS рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдорд▓реНрдЯреА-рдХреИрд╕) рдореЗрдВlibcds
[рдЕрднреА рдХреЗ рд▓рд┐рдП] рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ - рдЗрд╕ рдкрд░ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣реА рд░реБрдХрддрд╛ рд╣реИ, рдХрдИ рдЕрдзреНрдпрдпрдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, [Fra03] рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ DCAS рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдХреНрд╖рдо рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдиреЛрдЯ рдХрд┐рдпрд╛ рдХрд┐ рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХреА рдХрд╕реМрдЯреА рд▓реЙрдХ-рдлреНрд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕рдЦреНрддреА рд╕реЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЪреАрдЬ рд╣реИ: рдЗрд╕ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдЕрдм рдХреНрдпрд╛ рдЕрдкреНрд░рднрд╛рд╡реА рд╣реИ рдФрд░ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдВрдд рдкреНрд░рднрд╛рд╡реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ! рдлрдВрдбрд╛рдореЗрдВрдЯрд▓рдХреЗ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ , рд╣рдо рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ (рдореЗрдореЛрд░реА рдСрд░реНрдбрд░рд┐рдВрдЧ) - рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ (рдореЗрдореЛрд░реА рдмрд╛рдбрд╝, рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред Ref:[Cha05] рдбреАрди рдЪреИрдВрдбрд▓рд░ рдиреЗ .NET , 2005, Intel Corporation[Fra03] рдореЗрдВ рдЕрдореАрд░ рд╢реЗрд╕рд░ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╢реЗрдпрд░рд┐рдВрдЧ рдХреЛ рдХрдо рдХрд┐рдпрд╛рдкреНрд░реИрдХреНрдЯрд┐рдХрд▓ рд▓реЙрдХ рдлреНрд░реАрдбрдо , 2004; рддрдХрдиреАрдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗред рдлреНрд░реЗрдЬрд░ рджреНрд╡рд╛рд░рд╛ рдХреИрдореНрдмреНрд░рд┐рдЬ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп, рдХрд┐рдВрдЧреНрд╕ рдХреЙрд▓реЗрдЬ[рдбреЙрдХреНрдЯрд░ McKen05] рдкреЙрд▓ рдореИрдХрдХреЗрдиреА, рдереЙрдорд╕ рд╣рд╛рд░реНрдЯ, рдЬреЛрдирд╛рдерди рд╡рд╛рд▓рдкреИрди рдкреНрд░реИрдХреНрдЯрд┐рдХрд▓ рдЪрд┐рдВрддрд╛рдПрдБ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдбреЙрдХреНрдЯрд░ рдХреА рдбрд┐рдЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╕рд┐рддрдВрдмрд░ 2003 рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдПрдХ рд╢реЛрдз рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдПрдмреАрдП рд░реЛрдХрдерд╛рдо рдПрдХрд▓-рд╢рдмреНрдж рдирд┐рд░реНрджреЗрд╢ , рдЖрдИрдмреАрдПрдо рд░рд┐рд╕рд░реНрдЪ рд░рд┐рдкреЛрд░реНрдЯ, 2004 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПрд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рд╢реБрд░реБрдЖрддрдореВрд▓ рдмрд╛рддреЗрдВ:
рдЕрдВрджрд░:
рдмрд╛рд╣рд░ рд╕реЗ: