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

RCU рдХреЛ 2002 рдореЗрдВ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рддрдм рд╕реЗ рдпрд╣ рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рджрд╛рдИрдВ рдУрд░ рдЖрдХреГрддрд┐ рджреЗрдЦреЗрдВред рд▓рдВрдмреЗ рд╕рдордп рддрдХ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рддрдХрдиреАрдХ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдХрд░реНрдиреЗрд▓ рдХрд╛ рд╕рднреА рдереНрд░реЗрдбреНрд╕, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рджреЛрдиреЛрдВ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕реБрд░рдХреНрд╖рд┐рдд рдХреНрд╖рдг рдХреЛ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдкреНрд░рддрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рд╣рдо рдЖрд░рд╕реАрдпреВ рдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЖрд░рд╕реАрдпреВ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдЙрд╕рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд╢рдмреНрджрд╛рд╡рд▓реА рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдЖрд░рд╕реАрдпреВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг
рдЖрд░рд╕реАрдпреВ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рд╡рд░рдг рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдбреЗрдЯрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкрдврд╝рдиреЗ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ "рдордХреНрдЦреА рдкрд░" рдмрджрд▓рддреЗ рд╣реИрдВред рдлрд┐рд░ "рд░реАрдбрд░" рдПрдХ рдереНрд░реЗрдб рдмрди рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЛрдИ рднреА рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рдПрдХ рд▓реЗрдЦрдХ рдПрдХ рдзрд╛рд░рд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдХреБрдЫ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИред рдбрд┐рд▓реАрдЯ рдПрдХ рдРрд╕реЗ рд╕рдордп рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдХреЛрдИ рднреА рд╣рдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдкрд░ "рдХрджрдо" рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рд╣рдореЗрдВ рд╣рд╛рд░реНрдб-рдЯреВ-рдбрд┐рдЯреЗрдХреНрдЯ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓реЗрдЧрд╛ - рдПрдХ рдПрдмреАрдП рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕реНрдореГрддрд┐ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рддрдХред рдЖрд░рд╕реАрдпреВ рдЗрди рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рд╣реЗрдЬрд░реНрдб рдкреЙрдЗрдВрдЯрд░реНрд╕ рдпреЛрдЬрдирд╛ рд╕реЗ рдЕрд▓рдЧ рдПрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗред
RCU рддрдХрдиреАрдХ рдореЗрдВ рдкрд╛рдардХ рд░реАрдб-рд╕рд╛рдЗрдб рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред рдРрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп, рд░реАрдбрд░
rcu_read_lock()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░,
rcu_read_unlock()
ред рдпреЗ рдмрд╣реБрдд рд╣реА рд╣рд▓реНрдХреЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рд▓рдЧрднрдЧ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ; рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╡реЗ рд╕рдм рдХреБрдЫ (рд╢реВрдиреНрдп-рдУрд╡рд░рд╣реЗрдб) рдХрд╛ рд╡рдЬрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ рд╕реНрдЯреНрд░реАрдо рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо
рдХреНрд╡рд┐рдЬрд╝реЗрдВрдЯ рд╕реНрдЯреЗрдЯ (quiescent state, quiescent state) рдореЗрдВ рд╣реИред рдХрд┐рд╕реА рднреА рд╕рдордп рдХреА рдЕрд╡рдзрд┐ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рдПрдХ рдореМрди рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдПрдХ
рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХрд╣рд▓рд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдЬреЛ рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреЛ рдкрд░рд┐рдорд┐рдд рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдкрд░рд┐рдорд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░рд┐рдорд┐рдд рд╣реИ, рдФрд░ рдпрд╣ рднреА рдХрд┐ рд╣рдо рдЕрдЪреНрдЫреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╣реИрдВ рдФрд░ рдЕрдВрддрд╣реАрди рд▓реВрдк рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдереНрд░реЗрдб рдХреНрд░реИрд╢ рднреА рд╣реЛрддреЗ рд╣реИрдВ)ред

рдПрдХ рд▓реЗрдЦрдХ рдереНрд░реЗрдб рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдПрдХ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ, рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рддрддреНрд╡ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЧреНрд░реЗрд╕ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреЗ рдЦрддреНрдо рд╣реЛрдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдкрд╛рдардХ рдХреЗ рдкрд╛рд╕ рдбрд┐рд▓реАрдЯ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реАрдореЗрдВрдЯ рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ (рдЪрд┐рддреНрд░ рджреЗрдЦреЗрдВ, рдЙрд╕ рдкрд░ тАЬрд░реАрдбрд┐рдВрдЧтАЭ рдЖрдпрддреЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рдПрдХ рд▓реЗрдЦрдХ рдереНрд░реЗрдб рдХрд┐рд╕реА рдЖрдЗрдЯрдо рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рдХреЛ рджреЛ рдЪрд░рдгреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкрд╣рд▓рд╛ рдЪрд░рдг, "рд╣рдЯрд╛рдирд╛", рдкрд░рдорд╛рдгреБ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдПрдХ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрдореЛрд░реА рдХреЛ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд▓реЗрдЦрдХ рд╡рд┐рд╢реЗрд╖
synchronize_rcu()
рдЖрджрд┐рдо рдХрд╣рдХрд░ рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рдХреЗрд╡рд▓ рдЙрди рдкрд╛рдардХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рд▓реЗрдЦрдХ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрдкрдиреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ (рдЪрд┐рддреНрд░ рдореЗрдВ, рдРрд╕реЗ рдЕрдиреБрднрд╛рдЧ рдЧреНрд░реЗ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ)ред рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдРрд╕реЗ рд╕рднреА рдкрд╛рдардХ рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреА рд╕рдорд╛рдкреНрддрд┐ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓реЗрдВрдЧреЗред рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЕрд░реНрдерд╛рдд, рдЬрдм рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреЗ рджреМрд░рд╛рди рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рд╢реБрд░реВ рдпрд╛ рд╕рдХреНрд░рд┐рдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рд▓реАрд╢рди рдХрд╛ рджреВрд╕рд░рд╛ рдЪрд░рдг - "рд░рд┐рдХреНрд▓реЗрдореЗрд╢рди" - рдпрд╣ рд╣реИ, рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдореЗрдореЛрд░реА рдХрд╛ рднреМрддрд┐рдХ рд╡рд┐рд▓реЛрдкрди, рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, RCU рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рддрдХрдиреАрдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рд╕рд╡рд╛рд▓ рд░рд╣рддрд╛ рд╣реИ - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдореЗрдВ рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХреИрд╕реЗ рдХрд░реЗрдВ? рдореВрд▓ RCU рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рд▓рд┐рдП рднрд╛рд░реА рд╣реИ, рдЬрд╣рд╛рдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдореВрд▓ RCU рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдВрддрд░рд┐рдХреНрд╖ RCU
рдпрд╣ рдирд┐рд░реНрдгрдп 2009 рдореЗрдВ рдкреАред рдореИрдХрдиреЗрдиреА рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдПрдоред рдбреЗрд╕рдиреЙрдпрд░реНрд╕ рдиреЗ
рдЕрдкрдиреЗ рд╢реЛрдз рдкреНрд░рдмрдВрдз рдореЗрдВ
рджрд┐рдпрд╛ рдерд╛ , рдЬрд┐рд╕рдХрд╛ рдЕрдзреНрдпрд╛рдп 6 рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЖрд░рд╕реАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрддрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
M.Desnoyers рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдВрддрд░рд┐рдХреНрд╖ RCU (URCU) рдХреЗ рд▓рд┐рдП 3 рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
- Quiescent-State-based Reclamation RCU рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╣рд▓реНрдХреА рдпреЛрдЬрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдХреЗ рдмрд╛рд╣рд░ рдХреЗ рдзрд╛рдЧреЗ рд╕рдордп-рд╕рдордп рдкрд░ "рдореИрдВ рдПрдХ рдореМрди рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╣реВрдБ" рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реВрдБред рдпрд╣ рд╕рдорд╛рдзрд╛рди рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ libcds рд╣реИ , рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред
- рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдпреВрдЖрд░рд╕реАрдпреВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдВрддрд░рд┐рдХреНрд╖ рдЖрд░рд╕реАрдпреВ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдиреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
- рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ RCU рднреА рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд┐рдЧреНрдирд▓-рдЖрдзрд╛рд░рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ (рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдирд╣реАрдВ * рдирд┐рдХреНрд╕-рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд)ред Libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп-рдЙрджреНрджреЗрд╢реНрдп RCU рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдЦрд░рд╛рдм рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛, рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ M.Desnoyers'a рдирд┐рдмрдВрдз рдФрд░ libc рд╕реНрд░реЛрдд рд╕реНрд░реЛрдд рдХреЛрдб рдХреЗ рд▓рд┐рдП рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди URCU
M.Desnoyers URCU рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЗрддрдиреЗ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдЗрд╕рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ, рдХреЗрд╡рд▓ рдХреБрдЫ рдЪрд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдХреЛ рдмрджрд▓рдХрд░ рддрд╛рдХрд┐ рд╡реЗ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреЗ рд╣реЛрдВ рдЬреЛ рд▓рд┐рдмрдХрд╛рд░реНрдб рдореЗрдВ рдЕрдкрдирд╛рдП рдЧрдП рд╣реИрдВред
URCU рд╕реНрдХреАрдорд╛ рджреЛ рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
std::atomic<uint32_t> g_nGlobalCtl(1) ; struct thread_record { std::atomic<uint32_t> nThreadCtl; thread_record * pNext; thread_record(): nThreadCtl(0), pNext(nullptr) {} };
thread_record
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд╕реНрдерд╛рдиреАрдп рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдРрд╕реА рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ RCU рдереНрд░реЗрдбреНрд╕ рдХреА рд╕реВрдЪреА рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред
рдирд┐рдЪрд▓реЗ 31 рдмрд┐рдЯреНрд╕
nThreadCtl
рдореЗрдВ URCU рдХреЙрд▓ рдХреА рдШреЛрдВрд╕рд▓реЗ рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рд╣реЛрддрд╛ рд╣реИ (рд╣рд╛рдБ, URCU рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдб рд╕реЗрдХреНрд╢рди рдХреЗ рд▓рдЧрднрдЧ рдЕрд╕реАрдорд┐рдд рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ), рдЙрдЪреНрдЪ рдмрд┐рдЯ рдЙрд╕ рд╕рдордп рдХреА рдЧреНрд░реЗрд╕ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрдм рдереНрд░реЗрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИред рд╡рд░реНрдгрд┐рдд рдпреЛрдЬрдирд╛ рдореЗрдВ, рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рджреЛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред
рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░
g_nGlobalCtl
рдЙрдЪреНрдЪ рдмрд┐рдЯ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреА рдкрд╣рдЪрд╛рди рд╣реЛрддреА рд╣реИ, рдХрдо рдмрд┐рдЯреНрд╕
nThreadCtl
рдХреЗ рдкреНрд░рддрд┐-рдереНрд░реЗрдб рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрджрд▓рддреЗ рдирд╣реАрдВ рд╣реИрдВред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рд╕реЗ / рдореЗрдВ рдкреНрд░рд╡реЗрд╢ / рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП
access_unlock
рдХреНрд░рдорд╢рдГ рдХреНрд░рдорд╢рдГ
access_lock
рдФрд░
access_unlock
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
static uint32_t const c_nControlBit = 0x80000000; static uint32_t const c_nNestMask = c_nControlBit тАФ 1; void access_lock() { thread_record * pRec = get_thread_record(); assert( pRec != nullptr ); uint32_t tmp = pRec->nThreadCtl.load( std::memory_order_relaxed ); if ( (tmp & c_nNestMask) == 0 ) { pRec->nThreadCtl.store(g_nGlobalCtl.load( std::memory_order_relaxed ), std::memory_order_relaxed ); std::thread_fence( std::memory_order_acquire ); } else pRec->nThreadCtl.fetch_add( 1, std::memory_order_relaxed ); } void access_unlock() { thread_record * pRec = get_thread_record(); assert( pRec != nullptr ); pRec->nThreadCtl.fetch_sub( 1, std::memory_order_release ); }
URCU рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдкрд░, рдпрд╣ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдиреЗрд╕реНрдЯреЗрдб рд╣реИ рдпрд╛ рдирд╣реАрдВред рдпрджрд┐ рдХреЙрд▓ рдиреЗрд╕реНрдЯреЗрдб рд╣реИ (рдпрд╛рдиреА, рдирд┐рдЪрд▓реЗ 31 рдмрд┐рдЯреНрд╕ рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ), рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдХреЙрд▓ рдиреЗрд╕реНрдЯреЗрдб рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЗ
nThreadCtl
рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЧреНрд▓реЛрдмрд▓ рд╡реИрд░рд┐рдПрдмрд▓
g_nGlobalCtl
рдХрд╛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ (рдЙрдЪреНрдЪ рдмрд┐рдЯ
g_nGlobalCtl
) рдореЗрдВ рджрд░реНрдЬ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдирд┐рдореНрди рдмрд┐рдЯреНрд╕ рдореЗрдВ рдЗрдХрд╛рдИ
g_nGlobalCtl
рд╡рд░реНрддрдорд╛рди рд╕реНрдЯреНрд░реАрдо рдХреЗ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╕рдмрд╕реЗ рдмрд╛рд╣рд░реА рдкреНрд░рд╡реЗрд╢, рдореЗрдореЛрд░реА рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг-рдЕрд╡рд░реЛрдз рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдмрд╛рдж рдХреЗ рдХреЛрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдмрд╛рдзрд╛ рдХреЗ рдКрдкрд░ ("рдЕрдиреБрдХреВрд▓рд┐рдд") рдирд╣реАрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░реАрдо рдХреА рд╡рд░реНрддрдорд╛рди рдЧреНрд░реЗрд╕ рдЕрд╡рдзрд┐ рдХреА рджреГрд╢реНрдпрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ - рдпрджрд┐ рдЖрдк рдЗрд╕ рдЖрджреЗрд╢ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ URCU рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЙрдЦрдбрд╝ рдЬрд╛рдПрдЧрд╛ред
рдиреЗрд╕реНрдЯреЗрдб рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдмрд╛рдзрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ (рдЙрдЪреНрдЪ рдмрд┐рдЯ) рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб (
access_unlock
) рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╕рдордп, рд╡рд░реНрддрдорд╛рди рдереНрд░реЗрдб рдХреЗ
nThreadCtl
рдореЗрдВ рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ рдШрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдХреЗ рд░рд┐рд▓реАрдЬ рд╢рдмреНрджрд╛рд░реНрде рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рд░рд┐рд▓реАрдЬ рдмреИрд░рд┐рдпрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣рд╛рдБ рддрднреА рд╣реЛрддреА рд╣реИ рдЬрдм рдЙрдЪреНрдЪрддрдо рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд╕реЗрдХреНрд╢рди рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╕рдордп (рдЬрдм рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛рдЙрдВрдЯрд░ рд╕реЗ 1 рд╕реЗ 0 рдХреА рдУрд░ рдмрдврд╝ рд░рд╣реЗ рд╣реЛрдВ), рдиреЗрд╕реНрдЯреЗрдб рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд╕реЗрдХреНрд╢рди рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╕рдордп, рдЖрд░рд╛рдо рд╕реЗ рд╕рд┐рдореЗрдВрдЯрд┐рдХреНрд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛред рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд░рд┐рд▓реАрдЬ рдЕрд╡рд░реЛрдз рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛рдЙрдВрдЯрд░ 1 рд╕реЗ 0 рддрдХ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдШреЛрд╖рдгрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдереНрд░реЗрдб рдЖрд░рд╕реАрдпреВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ", рдЕрд░реНрдерд╛рдд, рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рддреА рд╣реИ, рдЬреЛ URCU рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рд╕рдВрдХрд▓рдХ рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рджреНрд╡рд╛рд░рд╛ рдЖрджреЗрд╢ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЕрдХреНрд╖рдорддрд╛ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛ред рдХреЛрдб рдореЗрдВ "0 - рдирд╣реАрдВ 0" рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╢рд░реНрдд рд╕рдВрдХреНрд░рдордг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬреЛ рдХрд┐
access_unlock
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ URCU рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдкреИрдЯрд░реНрди рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рд┐рдореЗрдВрдЯрд┐рдХ рдХреЛ рд╣рдореЗрд╢рд╛ рдпрд╣рд╛рдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд╛рдардХреЛрдВ рдХреА рдУрд░ рд╕реЗ рдХреЛрдб рдХрд╛рдлреА рд╣рд▓реНрдХрд╛ рд╣реИред рдкрд░рдорд╛рдгреБ рд░реАрдб-рд░рд╛рдЗрдЯ рдФрд░ рдереНрд░реЗрдб-рд╕реНрдерд╛рдиреАрдп рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рд╢реВрдиреНрдп-рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдореНрдпреВрдЯреЗрдХреНрд╕ рдпрд╛ рд╕реАрдПрдПрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред
рд▓реЗрдЦрдХ рдереНрд░реЗрдб рдХреЛ рдкрд╣рд▓реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рдХреА рд╢рд░реНрддреЗрдВ рджреЛ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ:
- рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХрд╛
nThreadCtl
рдмрд┐рдЯреНрд╕ (рдиреЗрд╕реНрдЯрд┐рдВрдЧ рдХрд╛рдЙрдВрдЯрд░) nThreadCtl
рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдзрд╛рдЧрд╛ URCU рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдореЗрдВ рдирд╣реАрдВ рд╣реИ nThreadCtl
рдХрд╛ рдЙрдЪреНрдЪ рдмрд┐рдЯ nThreadCtl
рдХреЗ рдЙрдЪреНрдЪ рдмрд┐рдЯ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╛рдардХ рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рдж рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ
рдЗрди рд╢рд░реНрддреЛрдВ рдХреЛ рдирд┐рдореНрди рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ:
bool check_grace_period( thread_record * pRec ) { uint32_t const v = pRec->nThreadCtl.load( std::memory_order_relaxed ); return (v & general_purpose_rcu::c_nNestMask) && ((( v ^ g_nGlobalCtl.load( std::memory_order_relaxed )) & ~c_nNestedMask )); }
рднреМрддрд┐рдХ рд╡рд┐рд▓реЛрдкрди рд╕реЗ рдкрд╣рд▓реЗ, рд▓реЗрдЦрдХ
synchronize
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЧреНрд░реЗрд╕ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ:
std::mutex g_Mutex ; void synchronize() { std::atomic_thread_fence( std::memory_order_acquire ); { cds::lock::scoped_lock<std::mutex> sl( g_Mutex ); flip_and_wait(); flip_and_wait(); } std::atomic_thread_fence( std::memory_order_release ); }
рдпрд╣рд╛рдБ
g_Mutex
URCU рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдореНрдпреВрдЯреЗрдХреНрд╕ рд╣реИ (рд╣рд╛рдБ, рд╣рд╛рдБ! URCU рдЕрднреА рднреА рдПрдХ
рддреБрд▓реНрдпрдХрд╛рд▓рди рддрдХрдиреАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдмрд┐рдирд╛ рдХрд╣реАрдВ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЗрд╡рд▓ рдПрдХ рд▓реЗрдЦрдХ рдереНрд░реЗрдб
synchronize
рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдЖрд░рд╕реАрдпреВ "рд▓рдЧрднрдЧ рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП" рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рддреИрдирд╛рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдореНрдпреВрдЯреЗрдХреНрд╕ рдкрд░ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рдХреНрд░рд╢ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рд╣реИред
рд▓реЗрдЦрдХ
flip_and_wait
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЧреНрд░реЗрд╕ рдЕрд╡рдзрд┐ рдХреЗ рдЕрдВрдд рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ:
void flip_and_wait() { g_nGlobalCtl.fetch_xor( c_nControlBit, std::memory_order_seq_cst ); for (thread_record* pRec = g_ThreadList.head(std::memory_order_acquire); pRec!= nullptr; pRec = pRec->m_pNext ) { while ( check_grace_period( pRec )) { sleep( 10 );
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдирдП рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреА рд╢реБрд░реБрдЖрдд, рдкрд░рдорд╛рдгреБ
fetch_xor
рдФрд░
fetch_xor
(
check_grace_period
рдХреЛ рдХреЙрд▓
check_grace_period
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЬрдм рддрдХ рдХрд┐ рд╕рднреА
check_grace_period
рдереНрд░реЗрдбреНрд╕ рдиреЗ рдЗрд╕ рдирдП рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреЛ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рджрд┐рдпрд╛ред рдЫрджреНрдо рдХреЛрдб рдореЗрдВ, рдкреНрд░рддреАрдХреНрд╖рд╛ 10 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдиреАрдВрдж рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ libcds рдХреЛрдб рдореЗрдВ, рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдмреИрдХ-рдСрдл рд░рдгрдиреАрддрд┐ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
flip_and_wait
рд▓реЗрдЦрдХ рджреЛ рдмрд╛рд░
flip_and_wait
рдХреНрдпреЛрдВ
flip_and_wait
? рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рдзрд╛рд░рд╛рдУрдВ A рдФрд░ B рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЗрд╕ рдХреНрд░рдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐
flip_and_wait
рдХреЛ
synchronize
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХреЗрд╡рд▓ рдПрдХ рд╣реИ:
access_lock
A рдХреЙрд▓ access_lock
ред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓ рдиреЗрд╕реНрдЯреЗрдб рдирд╣реАрдВ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ g_nGlobalCtl
рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрд╕реЗ nThreadCtl
рдЪрд░ nThreadCtl
рдХреЛ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ (рд╕рдм рдХреБрдЫ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ)- рдереНрд░реЗрдб рдмреА рдХреЙрд▓реНрд╕ рдХреЛ
synchronize
ред рдкрд╣рд▓рд╛ flip_and_wait
, рдЬреЛ flip_and_wait
рдореЗрдВ рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрд┐рдЯ рдХреЛ g_nGlobalCtl
ред рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ 1 рдмрди рдЬрд╛рддрд╛ рд╣реИ - рдЪреВрдВрдХрд┐ URCU рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдореЗрдВ рдХреЛрдИ рдирд╣реАрдВ рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдереНрд░реЗрдб рдП рдиреЗ рдЕрднреА рддрдХ рдЗрд╕рдХреЗ рдЪрд░
nThreadCtl
рдХрд╛ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ), рдереНрд░реЗрдб рдмреА рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ synchronize
nThreadCtl
рдП рдЕрдкрдиреЗ рд╡реИрд░рд┐рдПрдмрд▓ nThreadCtl
рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИред рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ рдзрд╛рд░рд╛ рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреЗ рдкреБрд░рд╛рдиреЗ рдореВрд▓реНрдп рдХреЛ рдкрдврд╝рддреА рд╣реИ, 0 рдХреЗ рдмрд░рд╛рдмрд░access_lock
рдП access_lock
рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ- рдереНрд░реЗрдб рдмреА рдХреЙрд▓реНрд╕ рдлрд┐рд░ рд╕реЗ
synchronize
(рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)ред рдлрд┐рд░ рд╕реЗ, рд╡рд░реНрддрдорд╛рди рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ g_nGlobalCtl
рдореЗрдВ g_nGlobalCtl
, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЕрдм 0 рд╣реИред
рд▓реЗрдХрд┐рди рдереНрд░реЗрдб рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдореЗрдВ рд╣реИ рдЬреЛ рдХрд┐ рдмреА рд╕реЗ
рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реБрдЖ
рдерд╛ рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдмрджрд▓ рдЧрдИ! рдпреВрдЖрд░рд╕реАрдпреВ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди, рдЬреЛ рдЕрдВрддрддрдГ рдПрдмреАрдП рд╕реЗ рд▓реЗрдХрд░ рд╕реНрдореГрддрд┐ рднреНрд░рд╖реНрдЯрд╛рдЪрд╛рд░ рддрдХ рдкреВрд░реЗ рдЧреБрд▓рджрд╕реНрддреЗ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред рд╕реНрдорд░рдг рдХрд░реЛ: рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдХреЛ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
synchronize
рдХреЛ рд▓реЗрдЦрдХ рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
flip_and_wait
рджреЛ рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдХреЗ, рджреЛ рдмрд╛рд░, рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдХреА рд╕рдорд╛рдкреНрддрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдХрд╛рд░рдг рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд┐рд╖реНрдкрд╛рджрди рд╣реИред
рдПрдХ рдФрд░ рдЙрдкрд╛рдпрдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рдЧреНрд░реЗрд╕ рдкреАрд░рд┐рдпрдб рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рдмрд┐рдЯ рдХреЗ рдмрдЬрд╛рдп рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓реЗрдЦ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦрд╛ - рдХрд╛рдЙрдВрдЯрд░ рдУрд╡рд░рдлреНрд▓реЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ! рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдХреЗ рд▓рд┐рдП, рдХрд╛рдЙрдВрдЯрд░ 32-рдмрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдлрд┐рд░ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рд╕реЗ 32-рдмрд┐рдЯ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ 64-рдмрд┐рдЯ рдкрд░рдорд╛рдгреБ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдпрд╛ рддреЛ рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдпрд╣ рдЕрдХреНрд╖рдо рд╣реИред рдпрд╛ рд╣рдореЗрдВ URCU рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд░реНрдЧреЛрдВ рдХреЗ рдШреЛрдВрд╕рд▓реЗ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рднреА рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдиреБрдЧреНрд░рд╣ рдЕрд╡рдзрд┐ рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдФрд░ рджреЛ flip_and_wait
рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╛рдзрд╛рди рдкрд░ рдзреНрдпрд╛рди flip_and_wait
URCU рдкрд░рд┐рд╡рд╛рджреЛрдВ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдгрд┐рдд URCU рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдкрдХреЛ
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд▓реЛрдкрди
рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛рдлреА рднрд╛рд░реА
synchronize
рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрдпрд╛ рдЗрд╕рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рд╣реИ?
рд╣рд╛рдБ, рдЖрдк рд╣реЗрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЙрд╕реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд┐рд▓рдореНрдм рд╡рд┐рд▓реЛрдкрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рддрддреНрд╡реЛрдВ рдХреЛ рдПрдХ рдмрдлрд░ рдореЗрдВ рдбрд╛рд▓ рджреЗрдВрдЧреЗред рдЬрдм рдмрдлрд╝рд░ рдкреВрд░реНрдг рд╣реЛ, рддреЛ рд╣рдо
synchronize
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗред рд╣реИрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, URCU рдореЗрдВ рдмрдлрд░ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧрд╛ (рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдкреНрд░рддрд┐-рдереНрд░реЗрдб рдмрдлрд╝рд░реНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд╕реЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЗрдЦрдХ рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд┐рд╕рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдлрд░ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдл рдХрд░рдирд╛ рдерд╛, рдмрдлрд░ рд╕рдлрд╛рдИ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛, рдпрд╛рдиреА, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡рд┐рд▓реЛрдкрди, рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ
рдкрд╛рдБрдЪ URCU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВ, рдЬреЛ рд╕рднреА
cds::urcu
рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ
cds::urcu
:
general_instant
рд╡рд░реНрдгрд┐рдд URCU рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдареАрдХ рдмрд╛рдж рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд▓реЛрдкрди synchronize
рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ, рдХреЛрдИ рдмрдлрд░рд┐рдВрдЧ рдирд╣реАрдВред рдпрджрд┐ рдирд┐рд╖реНрдХрд╛рд╕рди рдХрд╛рдлреА рдмрд╛рд░-рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдСрдкрд░реЗрд╢рди рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╕рдВрд░рдЪрдирд╛ "рд▓рдЧрднрдЧ-рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп" рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╣реЛрддрд╛ рд╣реИgeneral_buffered
рдПрдХ рдкреВрд░реНрд╡-рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдХ-рдлреНрд░реА рдмрдлрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рджрд┐рдорд┐рддреНрд░реА рд╡реНрдпреБрдХреЛрд╡ рдХреА рдХрддрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдХ-рдлреНрд░реА рдмрдлрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - cds::container::VyukovMPMCCycleQueue
ред рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИgeneral_threaded
- general_threaded
рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдмрдлрд╝рд░рд┐рдВрдЧ рдПрдХ рд╕рдорд░реНрдкрд┐рдд рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдорд░реНрдкрд┐рдд рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдереЛрдбрд╝рд╛ рдХрдо рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЗрдЦрдХреЛрдВ рдХреЛ рдзреАрдорд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИsignal_buffered
рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрдХреЗрдд-рдЖрдзрд╛рд░рд┐рдд URCU рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рд╡рд┐рдВрдбреЛрдЬ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдирд╣реАрдВsignal_threaded
- рд╕рдВрдХреЗрдд-рдирд┐рдпрдВрддреНрд░рд┐рдд URCU рдХреЗ рд▓рд┐рдП general_threaded
рдПрдирд╛рд▓реЙрдЧред рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рднреА рдирд╣реАрдВ
URCU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЗрддрдиреА рдмрд╣реБрддрд╛рдпрдд URCU рдХреЗ рддрд╣рдд рдХрдВрдЯреЗрдирд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЬрдиреНрдо рджреЗрддреА рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпреВрдЖрд░рд╕реАрдпреВ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЗрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИред рдЗрд╕рд▓рд┐рдП, URCU рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд▓реЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдкрд╛рдВрдЪ рдирд╣реАрдВред
URCU рдХреЗ рддрд╣рдд рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд▓рд┐рдЦрдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЖрд╡рд░рдг рд╡рд░реНрдЧ
cds::urcu::gc
рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
template <typename RCUimpl> class gc;
рдЬрд╣рд╛рдВ
RCUimpl
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ:
general_instant
,
general_buffered
, рдЖрджрд┐ рдРрд╕реЗ рдЖрд╡рд░рдг рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж,
general_buffered
рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╣реЛрдЧрд╛:
template < class RCU, typename Key, typename Value, class Traits > class SplitListMap< cds::urcu::gc< RCU >, Key, Value, Traits > ...
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ libcds рдореЗрдВ, рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рдордп URCU рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп
synchronize
рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди
retire_ptr
ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдпреВрдЖрд░рд╕реАрдпреВ рдмрдлрд░ рдореЗрдВ рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЛ рд░рдЦрддрд╛ рд╣реИ рдФрд░, рд╕рд╣реА рд╕рдордп рдкрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдмрдлрд░ рднрд░рд╛ рд╣реБрдЖ рд╣реИ), рдХреЙрд▓
synchronize
ред рддреЛ
synchronize
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реИрдз рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдпреВрдЖрд░рд╕реАрдпреВ рдФрд░ рд╣реЗрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред
рд╕реВрдЪреАрдмрджреНрдз URCU рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рднреА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рд╣реИрдВ: рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрд╡рд░рдг
cds::urcu::gc<cds::urcu::general_buffered<> >
рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
cds::urcu::gc<cds::urcu::general_buffered<> >
main()
рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ
main()
, рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
cds::Initialize()
:
#include <cds/init.h> //cds::Initialize cds::Terminate #include <cds/gc/general_buffered.h> // general_buffered URCU int main(int argc, char** argv) { // libcds cds::Initialize() ; { // general_buffered URCU cds::urcu::gc<cds::urcu::general_buffered<> > gbRCU ; // main thread lock-free // main thread // libcds cds::threading::Manager::attachThread() ; // , libcds // ... } // libcds cds::Terminate() ; }
рд╣реЗрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдпреЛрдЬрдирд╛ рдХреА рддрд░рд╣, URCU рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧреЗ рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХреЗ рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
Libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ URCU рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИ: рдмрд╕ URCU gc тАЛтАЛрдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ, рдмрд╕ред рдпреВрдЖрд░рд╕реАрдпреВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рдХрдВрдЯреЗрдирд░ рдХреЗ рдпреВрдЖрд░рд╕реАрдпреВ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИрдВред рдРрд╕реЗ рдХрдВрдЯреЗрдирд░ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред
UPD: рдЙрдлрд╝!"рдХреЛрдИ рдмрд╛рд╣рд░реА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ" - рдореИрдВ рдереЛрдбрд╝рд╛ рдЙрддреНрддреЗрдЬрд┐рдд рд╣реЛ рдЧрдпрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ URCU рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдб рд╕реЗрдХреНрд╢рди рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдорддреМрд░ рдкрд░, рдпреЗ рдХрд┐рд╕реА рдХрдВрдЯреЗрдирд░ рдЖрдЗрдЯрдо рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ (рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд) рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╣реИрдВред URCU рд╣рдореЗрдВ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдкрд╛рдП рдЧрдП рддрддреНрд╡ рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдЕрд╡рд╕рд░ рддрд╛рд▓рд╛-рдореБрдХреНрдд рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рджреБрд░реНрд▓рдн рдЕрдкрд╡рд╛рдж рд╣реИ, рдЬрд╣рд╛рдВ рдореМрдд рд╕реВрдЪрдХ рдХреА рд╡рд╛рдкрд╕реА рдЖрдорддреМрд░ рдкрд░ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддрддреНрд╡ рдХреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рдПрдХ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдзрд╛рдЧреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд▓реМрдЯреЗ рддрддреНрд╡ рд╕реВрдЪрдХ рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ access_lock
рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрдм рдкреЙрдЗрдВрдЯрд░ access_unlock
, access_unlock
, рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ (рдЕрдкрд╡рд╛рдж-рд╕реБрд░рдХреНрд╖рд┐рдд) рд╡рд┐рдзрд┐ рдХреЛрдб рдХреЗ рдПрдХ рдЕрд▓рдЧ рдмреНрд▓реЙрдХ рдореЗрдВ рд╕реНрдХреЛрдк-рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
Libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ URCU рдХрдВрдЯреЗрдирд░ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдХреИрд╕реЗ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдпрд╛ рдирд╣реАрдВред
рдпрджрд┐ рдЖрдк libcds рд╕реЗ URCU рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ URCU- рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЕрд▓реМрдХрд┐рдХ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ: рд╡рд┐рдзрд┐ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╕рдордп, рд╣рдо
gc::access_lock()
, рдЬрдм рд╣рдо рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо
gc::access_unlock()
(рдпрд╣рд╛рдБ
gc
URCU рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ; рдЕрдкрд╡рд╛рджреЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП, рдХреЙрд▓рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдХреЙрдкреНрдб рд▓реЙрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ) ред рдХреЗрд╡рд▓ рд╕реВрдХреНрд╖реНрдо рдмрд┐рдВрджреБ рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ: рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реАрдбрд┐рдВрдЧ рд╕реЗрдХреНрд╢рди рдореЗрдВ рднреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди
gc::retire_ptr
рдХреЙрд▓ рдХрд░рдХреЗ рдПрд▓рд┐рдореЗрдВрдЯ рдХрд╛ рднреМрддрд┐рдХ рдирд┐рд╖реНрдХрд╛рд╕рди
gc::retire_ptr
рдХреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдХреНрд╢рди рдХреЗ
рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдбреЗрдбрд▓реЙрдХ рд╕рдВрднрд╡ рд╣реИ: рдЕрдВрджрд░
gc::retire_ptr
рдХреЛ
synchronize
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Libcds рд╕рднреА рд╕реЗрдЯ рдФрд░ рдореИрдк рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП URCU рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрддрд╛рд░ рдФрд░ рд╕реНрдЯреИрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП URCU рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВ - рд╡реЗ "рд▓рдЧрднрдЧ рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП" рдХрдВрдЯреЗрдирд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП URCU рдЙрдирдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИрдВред
рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рд╢реБрд░реБрдЖрддрдореВрд▓ рдмрд╛рддреЗрдВ:
рдЕрдВрджрд░:
рдмрд╛рд╣рд░ рд╕реЗ: