
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ libcds рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓реЙрдХ-рдлреНрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рджреЗрддрд╛ рд╣реВрдВред рдореИрдВ рдпрд╣рд╛рдБ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдБрдЧрд╛, рдпрд╣ рдмрд╕
рдмрд╛рд╣рд░ рд╕реЗ рдПрдХ рдирдЬрд╝рд░ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рддрд░рдл рд╕реЗ рдПрдХ рдирдЬрд╝рд░ рд╣реИред
рдХрдИ рдкреНрд░рд╕рд┐рджреНрдз рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ libcds рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЕрдкрдирд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдпрд╣ рд▓рдХреНрд╖реНрдп рдХреНрд╖реЗрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд▓реЙрдХ-рдореБрдХреНрдд рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕реЗрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдиреНрдпреВрдирддрдо рд╣реИрдВ - рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдорд╛рдирдХ рдПрд╕рдЯреАрдПрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕реАрдорд╛рдУрдВ рдФрд░ рд╕рдорд╛рдзрд╛рдиреЛрдВ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рд╣реБрдЖ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рддрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рд╣реИред
рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ - рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ
Libcds рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдСрдл рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдореЗрдореЛрд░реА рд░рд┐рдХреНрд▓реЗрдореЗрд╢рди (SMR) рдореЗрдердб рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ рд╣реЗрдбрд░-рдХреЗрд╡рд▓ рд╣реИ - рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реЗрдбрд░ .h рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдХреЛрд░ рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рдЫреЛрдЯреЗ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ рдПрд╕.рдПрдо.рдЖрд░.
рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдкрддрд▓рд╛ рдмрд┐рдВрджреБ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕ рд╕рдордп рдХрд┐рд╕реА рдХрдВрдЯреЗрдирд░ рддрддреНрд╡ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рддрддреНрд╡ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╣рдореЗрд╢рд╛ рдПрдХ рджреЛ-рдЪрд░рдг рдСрдкрд░реЗрд╢рди рд╣реЛрддрд╛ рд╣реИ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдХрдВрдЯреЗрдирд░ рд╕реЗ рддрддреНрд╡ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ (рдбреАрд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ)ред рд▓реЙрдХ-рдлреНрд░реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рджреВрд╕рд░реЗ рдЪрд░рдг - рднреМрддрд┐рдХ рд╡рд┐рд▓реЛрдкрди - рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реА рдирд┐рд╢реНрдЪрд┐рддрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рднреА (рд╕рдорд╛рдирд╛рдВрддрд░ рдзрд╛рдЧреЗ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА) рд▓рд┐рдВрдХ, рд╡реИрд╢реНрд╡рд┐рдХ рдпрд╛ рд╕реНрдерд╛рдиреАрдп рдирд╣реАрдВ рд╣реИ, рд╣рдЯрд╛рдП рдЧрдП рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдПред
рд╕реБрд░рдХреНрд╖рд┐рдд рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╛рд╣рдХ (рдЬреАрд╕реА) рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ SMR рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЖрдВрддрд░рд┐рдХ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдореИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рд╡рд░рдг рджреВрдВрдЧрд╛, рдЬреЛ рдХрд┐ libcds рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореБрдЭреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕рднреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд SMR рдПрд▓реНрдЧреЛрд░рд┐рджрдо libcds рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ:
- рд╣реИрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рд╕рдВрднрд╡рддрдГ рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдкрд╣рд▓рд╛ рдФрд░ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рд╣реИред 2002 рдореЗрдВ рдорд╛рдЗрдХрд▓ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ (рдпрд╣ рдЕрдВрддрд┐рдо рдирд╛рдо рд╣реИ) [Mic02, Mic03, Mic04]ред рдпрд╣ рд╕рд╛рдкреЗрдХреНрд╖ рд╕рд╛рджрдЧреА рдФрд░ рдЕрдЪреНрдЫреА рдЧрддрд┐ рд╕реЗ рдЕрд▓рдЧ рд╣реИ, рдпрд╣ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд▓рд┐рдВрдХ рдХреЗ "рд╕рдВрд░рдХреНрд╖рдг" рдХреЗ рд▓рд┐рдП рд╣реИред рдиреБрдХрд╕рд╛рди - рдПрдХ рд╕рд╛рде рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдереНрд░реЗрдбреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рдВрдХреЗрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓
<cds/gc/hp.h>
, рд╡рд░реНрдЧ cds::gc::HP
- рдкрд╛рд╕-рдж-рдмрдХ - рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╣реЗрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред 2002 рдореЗрдВ рд╣реЗрд░рд▓рд╣рд┐, рд╡реАред рд▓реБрдЪрд╛рдВрдЧреНрдХреЛ рдФрд░ рдПрдоред рдореЛрдЗрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд [Her02, Her05]ред рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЗ рдХрд╛рд░рдг, рдпрд╣ рд╣реЗрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рднрд╛рд░реА рд╣реИред рд╣реИрдбрд░ рдлрд╝рд╛рдЗрд▓
<cds/gc/ptb.h>
, рд╡рд░реНрдЧ cds::gc::PTB
- рд╣реЗрдЬрд░реНрдб рдкреЙрдЗрдВрдЯрд░ рд╡рд┐рде рд░реЗрдлрд░реЗрдВрд╕ рдХрд╛рдЙрдВрдЯрд┐рдВрдЧ рд╣реИрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдПрдХ рд░реВрдкрд╛рдВрддрд░ рд╣реИ, рдЬреЛ рдХрд┐ H├еkan Sundell - Gidenstam et alред [Gid05, Gid06] рдХреЗ рдиреЗрддреГрддреНрд╡ рдореЗрдВ рд╕реНрд╡реАрдбрд┐рд╢ рд╕реНрдХреВрд▓ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╣реИред рд╣реИрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдХреА рддрд░рд╣, рдпрд╣ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡реЛрдВ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд░рдХреНрд╖рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рдФрд░ рджреБрд░реНрд▓рдн рдЪрдордХ рдХреЗ рдХрд╛рд░рдг рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ (рдореИрдВ рдЗрд╕реЗ рдЕрдВрдд рддрдХ рдбрд┐рдмрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛)ред рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓
<cds/gc/hrc.h>
, рд╡рд░реНрдЧ cds::gc::HRC
- рдЖрд░рд╕реАрдпреВ (рд░реАрдб-рдХреЙрдкреА рдЕрдкрдбреЗрдЯ) - рдЙрдкрд░реЛрдХреНрдд рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдпрд╣ рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп рдереНрд░реЗрдбреНрд╕ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рд▓рдВрдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдиреНрдп рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ - рдкреЗрд╕реНрдЯ, рдЦреЛрдЬ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдЗрд╕рд▓рд┐рдП рдпрд╣ рджреБрд░реНрд▓рдн рд╡рд┐рд▓реЛрдкрди рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реИ, рдирдХреНрд╢рд╛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рд╕реЗрдЯ рдХрд░реЗрдВред рдкреЙрд▓ рдореИрдХрдХреЗрдиреА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдореВрд▓ RCU рдХреЗрд╡рд▓ OS рдХреЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди 2009 рдореЗрдВ Desnoyers рдиреЗ рдЖрд╡реЗрджрди рдХреЗ рд▓рд┐рдП RCU (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ RCU, URCU) [Des09, Des11] рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдкрд░рд┐рд╡рд╛рджреЛрдВ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреБрд╕реНрддрдХрд╛рд▓рдп URCU рдХреЗ рдкрд╛рдВрдЪ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА URCU рд╣реИред рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓
<cds/urcu/general_buffered.h>
, рд╡рд░реНрдЧ cds::urcu::gc< cds::urcu::general_buffered<> >
ред Libcds рдореЗрдВ, URCU рдХреЗрд╡рд▓ рдорд╛рдирдЪрд┐рддреНрд░ рдФрд░ рд╕реЗрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ

рд╕рднреА рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЬреАрд╕реА рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА
рдПрдХрд▓ рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рдЬреАрд╕реА рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╣реИред рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп - libcds рдХреЛрд░ - рдореЗрдВ рдореВрд▓ SMR рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рд╛рд▓рд╛рдВрдХрд┐ libcds рдЖрдкрдХреЛ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬреАрд╕реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ? рд▓реЗрдХрд┐рди рдЖрдк рдПрдХ рд╣реА рдЬреАрд╕реА рдХреА рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЪреБрдирдирд╛ рд╣реИред Libcds рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЬреАрд╕реА рдЙрдирдХреЗ рдкрд╣рд▓реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ, рд╕реНрдореГрддрд┐ рдкреНрд░рдмрдВрдзрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ GC рд╡рд░реНрдЧ рдореЗрдВ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЕрдкрдирд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди GCs рдХреЗ рд▓рд┐рдП, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ (рд╢рд╛рдорд┐рд▓) рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реА рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдЬреАрд╕реА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд╕рднреА рдпрд╛рдВрддреНрд░рд┐рдХреА рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЬреАрд╕реА-рдирд┐рд░реНрднрд░ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧреЗ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЬреАрд╕реА рд╕рд┐рдВрдЧрд▓рдЯрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЬреАрд╕реА-рдлреНрд░реА рдХрдВрдЯреЗрдирд░Libcds рдореЗрдВ GC рдХреЗ рдмрд┐рдирд╛ рдХреБрдЫ рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ:
- рдкрд░рд┐рд╖реНрдХреГрдд (рдмрд╛рд░реАрдХ рджрд╛рдиреЗ рд╡рд╛рд▓реЗ) рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓реЙрдХ-рдЖрдзрд╛рд░рд┐рдд рдХрдВрдЯреЗрдирд░
- рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдХреЗ рдХрдВрдЯреЗрдирд░реЛрдВ рд╕реЗ рдШрд┐рд░рд╛ рд╣реБрдЖ
- рд╕реЗрдЯ рдФрд░ рдирдХреНрд╢рд╛, рдЬреЛ рд╣рдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдХреЗрд╡рд▓-рдЕрдкреЗрдВрдб)ред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ / рдореИрдк рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХреЗ рдкрд╛рд╕ "GC"
cds::gc::nogc
рд▓рд┐рдП рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рд╣реИред cds::gc::nogc
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рддрдереНрдп рдХрд╛ рдПрдХ рдирд┐рд╢рд╛рди рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░ рд╣рдЯрд╛рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
рдкрд░рд┐рд╡рд╛рджреЛрдВ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЖрд░рдореНрдн рдХрд░рдирд╛ рдПрдХ рдЬреАрд╕реА рд╡рд╕реНрддреБ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╣реИред рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЬреАрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрд╕ рдПрдХ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рдРрдб-рдСрди рд╣реИ рдЬреЛ рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЬреАрд╕реА-рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, - рдЬреАрд╕реА рдХреЗ рд╕рд╛рде рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрд╢рди рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ, - рдЗрд╕рд▓рд┐рдП, рдЬреАрд╕реА-рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдерд╛рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
Libcds рдореЗрдВ, рд╕рднреА рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ GC -
cds::gc::HP
,
cds::gc::PTB
,
cds::urcu::gc< cds::urcu::general_buffered<> >
, рдЗрддреНрдпрд╛рджрд┐ - рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЖрд░рдВрднреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВред рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ GC рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЬреАрд╕реА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реИрдВ; рдЗрд╕ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╣реВрдВрдЧрд╛ред
рд╣реИрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрдореЗрдВрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
#include <cds/init.h> //cds::Initialize cds::Terminate #include <cds/gc/hp.h> //cds::gc::HP (Hazard Pointer) int main(int argc, char** argv) { // libcds cds::Initialize() ; { // Hazard Pointer cds::gc::HP hpGC ; // main thread lock-free // main thread // libcds cds::threading::Manager::attachThread() ; // , libcds // ... } // libcds cds::Terminate() ; }
рд╕реАрдбреАрдПрд╕
cds::Initialize()
рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рдЖрдВрддрд░рд┐рдХ libcds рдбреЗрдЯрд╛ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдЯреЛрдкреЛрд▓реЙрдЬреА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж рдЬреАрд╕реА-рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ - рд╣реИрдЬрд╝рд░реНрдб рдкреЙрдЗрдВрдЯрд░, рдХреНрд▓рд╛рд╕
cds::gc::HP
, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рдлреЙрд▓реНрдЯ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
main
рдХреЗ рдЕрдВрдд рдореЗрдВ,
cds::Terminate
рдХреЙрд▓ рдХрд░реЗрдВ
cds::Terminate
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЯрд░реНрдорд┐рдиреЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ, рдЬреЛ рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛ред
рдХреНрдпрд╛ рдХреЙрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ :: рдЖрд░рдВрдн () рдФрд░ рд╕реАрдбреА :: рд╕рдорд╛рдкреНрдд ()?рдХреЙрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП cds::Initialize()
рдФрд░ cds::Terminate
(рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП DllMain
dll рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдпрд╛ рдЙрдиреНрд╣реЗрдВ GCC рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ / рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рд░ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рд╡рд┐рдлрд▓ рд╣реЛрдЧрд╛), рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдЖрдзреЗ рдЗрдирд▓рд╛рдЗрди рд╣реИрдВ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╡реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдзрд╛рдЧрд╛ рдЖрд░рдВрднреАрдХрд░рдг
рдХрдИ рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рд╕рд╛рде рд╣реА рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдбреЗрдЯрд╛ рдереНрд░реЗрдб (рдкреНрд░рддрд┐-рдереНрд░реЗрдб рдбреЗрдЯрд╛) рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдереНрд░реЗрдб рд▓реЛрдХрд▓ рд╕реНрдЯреЛрд░реЗрдЬ (TLS) рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдЙрдирдХреА рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдиреАрддрд┐ рдпрд╛ рдЙрдирдХреЗ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм libcds рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ рдЧрдпрд╛: рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪрдпрдирд┐рдд рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдореЙрдбрд▓ (рдпрд╛ рд╢реНрд░реЗрдгреА рдкрджрд╛рдиреБрдХреНрд░рдо) рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рдВрд▓рдЧреНрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред
Libcds рд╕реЗ рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧреЗ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
cds::threading::Manager
рд╡рд░реНрдЧ рдЖрдВрддрд░рд┐рдХ рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдг рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рд╡рд░реНрдЧ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреЗрд╡рд▓ libcds рдЕрд╡рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ / рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдереНрд░реЗрдб рдЖрд░рдВрднреАрдХрд░рдг рдХреЛрдб рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдПрдХ рдЕрдзрд┐рдХ рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдЗрд╕реЗ рдХрд╛рдЯ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ GC рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ
thread_gc
рд╡рд░реНрдЧ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде, рдзрд╛рд░рд╛ рдХрд╛ рдЖрд░рдВрдн рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
#include <cds/gc/hp.h> int myThreadEntryPoint(void *) { // libcds cds::gc::HP::thread_gc threadGC ; // // lock-free libcds ... return 0; }
рдЕрдЧрд░ рдзрд╛рд░рд╛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдПрдХ рдзрд╛рд░рд╛ рдХреЛ рдЙрди libcds рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рдереА, рдФрд░ рд╣рдо рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкреНрд▓рдЧрдЗрди рд╣реИред рд╡реЗрдм рд╕рд░реНрд╡рд░ рдПрдХ рдереНрд░реЗрдб рдкреВрд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрди рдереНрд░реЗрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╣реИрдВрдбрд▓рд░ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рди рддреЛ рдЬреАрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рди рд╣реА рдереНрд░реЗрдб рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЯрд╛рдЗрдк
GC::thread_gc
рдХреА рдПрдХ рд╡рд╕реНрддреБ рдШреЛрд╖рд┐рдд рдХрд░рдХреЗ
GC::thread_gc
ред рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдЖрдкрдХреЛ libcds рдХреЗ рдЖрдВрддрд░рд┐рдХ рдЖрд░рдВрднреАрдХрд░рдг рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛: рдПрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝рд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ рдФрд░ рдЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдПрдХ рд╕реНрдерд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:
#include <cds/gc/hp.h> class LibcdsInit { public: LibcdsInit() { // libcds cds::Initialize(); // Hazard Pointer singleton cds::gc::hzp::GarbageCollector::Construct() ; } ~LibcdsInit() { // Hazard Pointer singleton // true тАУ // Hazard Pointer cds::gc::hzp::GarbageCollector::Destruct(true) ; // libcds cds::Terminate(); }; }; // static LibcdsInit libcdsInitializator ;
LibcdsInit
initializer
LibcdsInit
рдмрдЬрд╛рдп
LibcdsInit
рд╕рдВрдмрдВрдзрд┐рдд рдХреЙрд▓
DllMain
(рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП) рдпрд╛ рдирд┐рд░реНрдорд╛рддрд╛ / рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╛рд░реНрдпреЛрдВ (GCC рдХреЗ рд▓рд┐рдП
__attribute__((constructor))
рдореЗрдВ рд░рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдереНрд░реЗрдб рдХрд╛
cds::threading::Manager::attachThread()
рдЗрд╕реЗ "рд╣рдореЗрд╢рд╛" рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЙрд▓рд┐рдВрдЧ
cds::threading::Manager::attachThread()
:
рд╣рдо рдПрдХ рдзрд╛рд░рд╛ рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред

рдХрдВрдЯреЗрдирд░
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Libcds рдореЗрдВ, рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ рджреЛ рдмрдбрд╝реЗ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдирд┐рдпрдорд┐рдд рдФрд░
рдЕрд╕рд╛рдорд╛рдиреНрдп рдШреБрд╕рдкреИрдаред
рдирд┐рдпрдорд┐рдд рдПрд╕рдЯреАрдПрд▓-рд╢реИрд▓реА рдХреЗ рдХрдВрдЯреЗрдирд░ рд╣реЛрддреЗ рд╣реИрдВ, рд╡реЗ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реЗ рд╕рднреА рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЛ
cds::container
рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
cds::container
рдиреЗрдорд╕реНрдкреЗрд╕ред
рдШреБрд╕рдкреИрда рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рди рдХрд┐ рдЙрдирдХреА рдкреНрд░рддрд┐рдпрд╛рдВред рд╡рд┐рдЪрд╛рд░ рдХреЛ
рдмрдврд╝рд╛рд╡рд╛ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
:: рдШреБрд╕рдкреИрда ред рдШреБрд╕рдкреИрда рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдмрд┐рдирд╛ рдХрд╛рд░рдг рдХреЗ рдирд╣реАрдВ, рдХрд┐ рдПрдХ рдорд╛рдирдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд▓реЙрдХ-рдлреНрд░реА рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдирдХрд╛рд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдореЗрдВ рд╕реНрд╡рдпрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рд╣реЛрддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рд╕рд╣реА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдзреБрдирд┐рдХ рдЙрдиреНрдирдд рдЖрдмрдВрдЯрдХ рдЗрд╕рдХреЗ рдХрд╛рд░рдг рдЖрдВрддрд░рд┐рдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдкреВрд▓ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдШреБрд╕рдкреИрда рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рдирд╣реАрдВ рджреВрдВрдЧрд╛ - рдЙрдиреНрд╣реЗрдВ рдореЗрдореЛрд░реА рд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рддрдХрдиреАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рддрддреНрд╡ рдХреЛ рдХрдВрдЯреЗрдирд░ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрдЧ рдШреБрд╕рдкреИрда рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рднреА рджрд┐рд▓рдЪрд╕реНрдк рд▓реЙрдХ-рдлреНрд░реА рдХреЛрдб рдШреБрд╕рдкреИрда рд╡рд╛рд▓реЗ рдХрдВрдЯреЗрдирд░ рдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╣реИрдВред рдШреБрд╕рдкреИрда рдХреЗ рдХрдВрдЯреЗрдирд░
cds::intrusive
рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
cds::intrusive
ред
Libcds рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдПрдХ рд╕рдорд╛рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ
- рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░
рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ-рдЖрдзрд╛рд░рд┐рдд рд╡рд┐рдЬреНрдЮрд╛рдкрди рд╕рд░рд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ - рдвреЗрд░ рдФрд░ рдХрддрд╛рд░реЗрдВред рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
template <typename GC, typename T, typenameтАж Options> class queue { тАж };
рдРрд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЛ рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдореБрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХреЗ рдЕрдВрджрд░,
Options
рдПрдХ
Traits
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╡реИрд░рд┐рдПрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрдЯрд┐рд▓ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рдерд╛, рдЗрд╕рд▓рд┐рдП рд▓рдХреНрд╖рдг рдШреЛрд╖рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрдВрдЯреЗрдирд░реЛрдВ рдЬреИрд╕реЗ
set
,
map
, рдЖрджрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
template <typename GC, typename T, typename Traits> class set { тАж };
рдРрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП,
make_traits
рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд╡реИрд░рд┐рдПрдб рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рд▓рдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ:
template <typenameтАж Options> struct make_traits { typedef typename pack<OptionsтАж>::type type ; };
make_traits
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ
make_traits
рдХрдВрдЯреЗрдирд░ рдСрдмреНрдЬреЗрдХреНрдЯ
make_traits
рдШреЛрд╖рдгрд╛ рдлрд╛рд░реНрдо рд▓реЗрддрд╛ рд╣реИ:
struct Foo { тАж }; cds::container::SkipListSet< cds::gc::HP, Foo, typename cds::container::skip_list::make_traits< Opt1, Opt2, Opt3 >::type > theSkipListSet ;
рдЗрд╕ рддрд░рд╣ рдХреА рдШреЛрд╖рдгрд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╢рд╛рдВрдд рджрд┐рдЦрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рдордп рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░ рд╕рдХрддреА рд╣реИ - рд╡рд░реНрдЧ рдХрд╛ рдирд╛рдо рдХрдИ рджрд╕рд┐рдпреЛрдВ рд▓рд╛рдЗрдиреЗрдВ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рдг рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИрдВ:
struct Foo { тАж }; struct skipListSetTraits: public cds::container::skip_list::make_traits< Opt1, Opt2, Opt3 >::type {}; cds::container::SkipListSet< cds::gc::HP, Foo, skipListSetTraits > theSkipListSet ;
рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рд╣реИрдВ:
GC
- рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛T
- рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░OptionsтАж
рдпрд╛ Traits
- рдХрдВрдЯреЗрдирд░ рдХреЗ рд╡рд┐рдХрд▓реНрдк (рдиреАрддрд┐рдпрд╛рдБ, рд░рдгрдиреАрддрд┐рдпрд╛рдБ)
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЕрд▓рдЧ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдПред

рд╡рд┐рдХрд▓реНрдк
рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ, рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ SMR рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕рдореЗрдВ рдпрд╛ рдЙрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рд╡рд┐рдз рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрд░реНрдбрд░ рдХрд┐рдП рдЧрдП рдХрдВрдЯреЗрдирд░реЛрдВ (рдорд╛рдирдЪрд┐рддреНрд░, рд╕реЗрдЯ) рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рддрддреНрд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд┐рдзреЗрдп рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
std::less<T>
ред рдпрд╛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд╛рдо (рдмреИрдХ-рдСрдл рд░рдгрдиреАрддрд┐) рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЗрд╕ рдпрд╛ рдЙрд╕ рд░рдгрдиреАрддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╛ рдХрдВрдЯреЗрдирд░ рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдореЗрдВ рдХрдИ (рдПрдХ рджрд░реНрдЬрди рддрдХ) рд╣реЛрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕, рдЬрд┐рд╕реЗ рдореИрдВ рд╡рд┐рдХрд▓реНрдк рдХрд╣рддрд╛ рд╣реВрдВред рдПрд╕рдЯреАрдПрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬрдм рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯрд┐рдВрдЧ рдПрдХ рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ: рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╡рд╛рд▓реЗ рдРрд╕реЗ рд╕реНрдерд┐рддрд┐-рдирд┐рд░реНрднрд░ рддрд░реНрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде 10 рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рд╣реИрдВ, рддреЛ рдЖрдард╡реЗрдВ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЖрдард╡реЗрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╕рднреА рд╕рд╛рдд рддрд░реНрдХреЛрдВ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, libcds рдореЗрдВ рдореИрдВ рдПрдХ рд╕реНрдерд┐рддрд┐-рд╕реНрд╡рддрдВрддреНрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ; рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛" рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдШреЛрд╖рдгрд╛ рд╣реИ:
template <typename Alloc> struct allocator { template <typename Base> struct pack: public Base { typedef Alloc allocator ; }; };
рдпрд╣рд╛рдВ,
Alloc
рдЯреЗрдореНрдкреНрд▓реЗрдЯ рддрд░реНрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ
Alloc
рд╡рд░реНрдЧ рд╣реИ, рдФрд░
allocator
рд╕рдВрд░рдЪрдирд╛ рд╕реНрд╡рдпрдВ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдирд╛рдо рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛рд░реНрдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
cds::opt::allocator< std::allocator<int> >
рдЗрди рд╡рд┐рдХрд▓реНрдк рдШреЛрд╖рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдПрдХ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ
traits
рд╕рдВрд░рдЪрдирд╛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ
рдкреИрдХрд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
Libcds рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдк - рдХрдИ рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдРрд╕реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдШреЛрд╖рдгрд╛
cds::opt
рдирд╛рдо рд╕реНрдерд╛рди рдХрд╛ cds::opt
, рдФрд░ рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдк рдорд╛рдиреЛрдВ рдХреЗ рдирд╛рдорд╕реНрдерд╛рди cds::opt::v
- рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдХрд▓реНрдк - рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред рдЙрдирдХреА рдШреЛрд╖рдгрд╛рдПрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдВрдЯреЗрдирд░ рдХреЗ рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
cds::container::skip_list
рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдЯреЗрдирд░ рд╡рд░реНрдЧ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╡реИрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред
рддреБрд▓рдирд╛ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддреА рд╣реИ
рдХрдИ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдЬреИрд╕реЗ рдирдХреНрд╢рд╛, рд╕реЗрдЯ, рддрддреНрд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзреЗрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред STL рдореЗрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП
std::less<T>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓
T
рддрддреНрд╡реЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
T
рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдмрд╛рд░ рдпрд╣ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдорд╣рдВрдЧрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
std::string
рдкреНрд░рдХрд╛рд░ рдХреА рддреБрд▓рдирд╛
char const *
рдорд╛рди рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдФрд░ рдРрд╕реА рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА
std::string
рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╕реЗрдЯ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП,
T
рд╕реНрдЯреЛрд░ рдХрд┐рдП рдЧрдП рдЯрд╛рдЗрдк
T
рдореЗрдВ рдЕрдХреНрд╕рд░ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ "рд▓реЛрдб" рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЦреЛрдЬ рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИред
рдХрд╣рд╛ рдХрд┐ рд╕рднреА рдХреЗ рд╕рд╛рде, libcds рдЙрдиреНрдирдд рд╡рд┐рдзреЗрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рдзреЗрдп рд╡рд┐рдХрд▓реНрдк рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрдо (рд╡рд┐рдХрд▓реНрдк
cds::opt::less< typename Less >
) рдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рддреБрд▓рдирд╛ (рд╡рд┐рдХрд▓реНрдк
cds::opt::compare< typename Comparator >
) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░рд┐рдЯрд░реНрди рдХреА рддреБрд▓рдирд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдорд╛рди рд╕реЗ рдХрд░реЗрдВ:
cmp(a, b) < 0
рдпрджрд┐ a < b
cmp(a, b) == 0
рдЕрдЧрд░ a == b
cmp(a, b) > 0
рдЕрдЧрд░ a > b
рд╡рд┐рдзрд┐ рд╕рдорд╛рд░реЛрд╣
std::string::compare
рднреА рдХрд╛рдо рдХрд░рддреА рд╣реИред
рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд▓реЗрдЦрди рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рддрд╛ рд╣реИ (
cds::opt::less< typename Less >
рд▓рд┐рдП
Less
cds::opt::less< typename Less >
рд╡рд┐рдХрд▓реНрдк рдпрд╛
cds::opt::compare< typename Comparator >
рд▓рд┐рдП
cds::opt::compare< typename Comparator >
рд╡рд┐рдХрд▓реНрдк) рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдпрд╣рд╛рдБ
Comparator
рд╕реНрдЯреНрд░рд┐рдВрдЧ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рдХреИрд╕рд╛ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
struct string_cmp { int operator()(std::string const& s1, std::string const& s2) const { return s1.compare( s2 ); } int operator()(std::string const& s1, char const* s2) const { return s1.compare( s2 ); } int operator()(char const* s1, std::string const& s2) const { return тАУs2.compare( s1 ); } };
allocators
cds::container
рд╕реЗ рдХрдВрдЯреЗрдирд░
cds::container
рдиреЗрдорд╕реНрдкреЗрд╕ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рдпреЛрдВ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдирдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ
cds::opt::allocator
- рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ред рдХреБрдЫ рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рджреЛ рдЖрд╡рдВрдЯрди рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ - рдПрдХ рдбреЗрдЯрд╛ рд╡рд┐рддрд░рдг рдХреЗ рд▓рд┐рдП (
cds::opt::node_allocator
), рджреВрд╕рд░рд╛ (
cds::opt::allocator
) - рд╕рд╣рд╛рдпрдХ рдХрдВрдЯреЗрдирд░ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ,
std::allocator<int>
рдПрдХ
std::allocator<int>
рд░реВрдк
std::allocator<int>
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕
std::allocator
рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рджреЛ рдЧреБрдгреЛрдВ рдкрд░ рдмрд╣реБрдд рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ:
- рдкреНрд░рддреНрдпреЗрдХ рдЖрдмрдВрдЯрдХ рдХреЗ рдкрд╛рд╕ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди
template <typename Other> struct rebind
, рдЬреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ Other
рд▓рд┐рдП рдПрд▓реЛрдХреЗрдЯрд░ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рдерд╛, рдбрд┐рдлреЙрд▓реНрдЯ std::allocator<int>
, - рдХрдВрдЯреЗрдирд░ рд░рд┐рдмреЗрдЯ рдореЗрдЯрд╛рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ int
рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ - рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ рд╣реИред рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЙрдкрдЬреА рд╣реИ рдХрд┐ рд▓реЙрдХ-рдлреНрд░реА рдХрдВрдЯреЗрдирд░ рддрддреНрд╡ рдХреЗ рднреМрддрд┐рдХ рдирд┐рд╖реНрдХрд╛рд╕рди рдореЗрдВ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИ рдФрд░ рдХрдВрдЯреЗрдирд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рдмрд╛рдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдПрд╕рдЯреАрдПрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, libcds рдХрдВрдЯреЗрдирд░ рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдХрднреА рд╕реНрдЯреЛрд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдПрд▓реЛрдХреЗрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрдВрдЯреЗрдирд░ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
allocator_type().allocate( 1 )
ред рдЗрд╕реА рддрд░рд╣, рдореЗрдореЛрд░реА рдХреЛ allocator_type().deallocate( p )
рдХрд╣рдХрд░ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд░рд┐рд▓реАрдЬ рдореЗрдВ рджреЗрд░реА рд╣реЛ рд░рд╣реА рд╣реИ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдХрдВрдЯреЗрдирд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдЦреБрдж рдирд╣реАрдВ рд░рд╣ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдПрд╕рдПрдордЖрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг
рд╕рдорд░реНрдерд┐рдд рд╕рдВрдХрд▓рдХ:
- рдЬреАрд╕реАрд╕реА 4.3 рдФрд░ рдЙрдЪреНрдЪрддрд░
- MS Visual C ++ 2008 рдФрд░ рдЙрдЪреНрдЪрддрд░
- Clang 3.0 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ (GCC рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА libstdc ++ рдХреЗ рд╕рд╛рде)
рд╕рдорд░реНрдерд┐рдд рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░:
- рд╡рд┐рдВрдбреЛрдЬ x86, amd64
- рд▓рд┐рдирдХреНрд╕ x86, amd64, рдЗрдВрдЯреЗрд▓ рдЗрдЯреЗрдирд┐рдпрдо, рд╕реНрдкрд╛рд░реНрдХ
- рд╕реЛрд▓рд╛рд░рд┐рд╕ рд╕реНрдкрд╛рд░реНрдХ
- рдПрдЪрдкреА-рдпреВрдПрдХреНрд╕ рдЗрдВрдЯреЗрд▓ рдЗрдЯреЗрдирд┐рдпрдо
рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рддреБрдЪреНрдЫ рдирд╣реАрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рд▓рдХреНрд╖реНрдп рд╕рдВрдХрд▓рдХ C ++ 11
atomic
рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ libcds рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдореИрдВ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реВрдВред
рдореИрдВ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдЫреВрддрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдиреЛрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдФрд░ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмрд╛рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЖрдзреБрдирд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдВ рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ: рдПрдХ рдЙрдирдХрд╛ рдкрдХреНрд╖рдзрд░ рд╣реИ, рджреВрд╕рд░реЗ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд░рд╛рдЬреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд╕реНрд╡реАрдХрд╛рд░реНрдп рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рдпрд╛ рдЙрди рдХрдВрдЯреЗрдирд░ рдХреНрд▓рд╛рд╕ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ред
рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЕрдкрдиреЗ рдирд┐рдпрдорд┐рдд рд╕рдордХрдХреНрд╖реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬрдЯрд┐рд▓ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░рдХ "рдЬреЛ рддреЗрдЬ рд╣реИ" рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ: рдпрд╛ рддреЛ рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрджрд┐рдо + рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрдВрдЯреЗрдирд░, рдпрд╛ рдмрд╛рд╣рд░реА рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЬрдЯрд┐рд▓ рд▓реЙрдХ-рдлреНрд░реА рдХрдВрдЯреЗрдирд░редрдпрджрд┐ рдЖрдк рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╣реИ: рд╕рд╛рдЭрд╛ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ ред рдореИрдВрдиреЗ рдРрд╕реА рд╕рд▓рд╛рд╣ рд╕реЗ рдЕрдореЗрд░рд┐рдХрд╛ рдХреА рдЦреЛрдЬ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рд░реЛрдЬрдорд░реНрд░рд╛ рдХреА рдЬрд┐рдВрджрдЧреА рдореЗрдВ рдЗрд╕рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрд╕рдВрджрд░реНрдн[Des09] M.Desnoyers
Low-Impact Operating System Tracing PhD Thesis,Chapter 6 ┬лUser-Level Implementations of Read-Copy Update┬╗
[Des11] M.Desnoyers, P.McKenney, A.Stern, M.Dagenias, J.Walpole
User-Level Implementations of Read-Copy Update[Gid05] Anders Gidenstam, Marina Papatriantafilou and Philippas Tsigas
Practical and Efficient Lock-Free Garbage Collection Based on Reference Counting[Gid06] A.Gidenstam
Algorithms for synchronization and consistency in concurrent system services , Chapter 5 ┬лLock-Free Memory Reclamation┬╗ Thesis for the degree of Doctor of Philosophy
[Her02] M. Herlihy, V. Luchangco, and M. Moir.
The repeat offender problem: A mechanism for supporting dynamic-sized lockfree data structures Technical Report TR-2002-112, Sun Microsystems Laboratories, 2002
[Her05] M. Herlihy, V. Luchangco, P. Martin, and M. Moir.
Nonblocking Memory Management Support for Dynamic_Sized Data Structures ACM Transactions on Computer Systems, Vol.23, No.2, May 2005
[Mic02] Maged M.Michael
Safe memory reclamation for dynamic lock-free objects using atomic reads and writes[Mic03] Maged M.Michael
Hazard Pointers: Safe memory reclamation for lock-free objects[Mic04] Andrei Alexandrescy, Maged Michael
Lock-free Data Structures with Hazard Pointers рд▓реЙрдХ-рдлреНрд░реА рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрд╕рд╢реБрд░реБрдЖрддрдореВрд▓ рдмрд╛рддреЗрдВ:
рдЕрдВрджрд░:
рдмрд╛рд╣рд░ рд╕реЗ: