рд╣реИрдмреНрд░реЛрдкреЛрд▓рд┐рд╕ рдХреА рд╕рд▓рд╛рд╣ рдХреЗ рдмрд╛рдж, рдореИрдВ " рд▓реЙрдХ-рдлрд╝реНрд░реА " рд╢рдмреНрдж рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЖрдЬрд╝рдорд╛ рд░рд╣рд╛ рд╣реВрдВрдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдПрдХ "рд╕реНрдкрд┐рд░рд┐рдЯрд▓реЗрд╕" рдПрд▓реНрдЧреЛрд░рд┐рдердо рджреЗрдЦрд╛ рдерд╛, рдЬрд╣рд╛рдБ рдХреИрдкреНрдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╡рд╛рд▓рд╛ рдереНрд░реЗрдб рдЙрдирдХреА рд░рд┐рд▓реАрдЬрд╝ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗ, рд▓реЗрдХрд┐рди "рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб" (рдХреИрд╢ рд╕реЗрд╡рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ) рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдкрдиреА рдЕрдЧрд▓реА рдкреЛрд╕реНрдЯ рдореЗрдВ, рд░реЗрдордВрдб рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдХреЛрдИ "рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб" рдирд╣реАрдВ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрдВрджреА рдмрдирд╛ рд╣реБрдЖ рд╣реИ: рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд░рд┐рд▓реАрдЬ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд┐рдП рдмрд┐рдирд╛, рдкреНрд░рддреНрдпреЗрдХ рдереНрд░реЗрдб рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред
рд╕рд╛рдЭрд╛ рдЪрд░ рдореЗрдВ, рджреЛ рд╕реЗрд╡рд╛ рдмрд┐рдЯреНрд╕ рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдХреИрдкреНрдЪрд░ рдлрд╝реНрд▓реИрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдлрд╝реНрд▓реИрдЧ "рдХрдореАрд╢рди рд╡рд░реНрдХ"; рдФрд░ рдпрджрд┐ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рдЬрдЯрд┐рд▓ рд╣реИ, рддреЛ рдзреНрд╡рдЬ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд╣реАрдВ рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪрд░ рдореЗрдВ, рдЖрдк рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ (рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрд░реЗрдЦрд┐рдд) рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рдореЗрдВ - рджреЛ рдирд╛рдорд┐рдд рдЭрдВрдбреЗред
рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╣реИрдВ, рдПрдЯреЛрдорд┐рдХрд▓реА рд╕рдВрдмрдВрдзрд┐рдд рдЭрдВрдбреЗ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╣рд▓реЗ рд╣реА рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рджреВрд╕рд░реЗ рдЭрдВрдбреЗ рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рдЕрдкрдиреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдХреИрдкреНрдЪрд░ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕реМрдВрдк рджреЗрдВрдЧреЗред
рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХреИрдкреНрдЪрд░ рдлреНрд▓реИрдЧ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдЙрд╕реА рд╕рдордп рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдореЗрдВ рдПрдХ рдирдпрд╛ рдХрд╛рдо рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред (рдЕрд░реНрдерд╛рдд, рдЙрд╕ рд╕рдордп рдЬрд┐рд╕ рд╡рд╕реНрддреБ рдХреЛ рд╣рдордиреЗ рд░рдЦрд╛ рдерд╛, рдЙрд╕ рджреМрд░рд╛рди рд╡рд╕реНрддреБ рдХреЛ рдХреЛрдИ рдХреЙрд▓ рдерд╛ред) рдпрджрд┐ рдХрд╛рдо рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рднреА рдХрд░реЗрдВрдЧреЗ; рдФрд░ рдЗрд╕реА рддрд░рд╣, рдЬрдм рддрдХ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдирд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддрдм рддрдХ рдХреЛрдИ рдХрд╛рдо рд▓рдВрдмрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рдо "рдХрдмреНрдЬрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдХрд╛рдо рд╣реИ" рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡рд╕реНрддреБ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд╣рдХрджрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк "рдХрд░реЛ, рд▓рд┐рдЦреЛ, (рджреВрд╕рд░реЗ рдХреЛ рд╕реМрдВрдкреЛ)" рдореЙрдбрд▓ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдИ рдЪрдХреНрд░реЛрдВ рд╕реЗ рдмреБрдирд╛ рд╣реБрдЖ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдореЗрдВ рдПрдХ рдЪрдХреНрд░ рд╣реЛрддрд╛ рд╣реИ; рдЖрд╕реНрдердЧрд┐рдд рдХрд╛рд░реНрдп рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдПрдХ рдЪрдХреНрд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдФрд░ рд╣рд░ рдмрд╛рд░
InterlockedCompareExchange
рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдУрд╡рд░рд░рд╛рдЗрдЯрд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдХрд┐рдП рдЧрдП рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╢реБрд░реВ рд╕реЗ рд╣реА рдХрд░реЗрдВред рдореЙрдбрд▓ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред рд░реЗрдордВрдб рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдЗрд╕ рддрд░рд╣ рдХрд░рддреЗ рд╣реИрдВ: "рдкреВрд░реА рджреБрдирд┐рдпрд╛ рдореЗрдВ, рд╢рд╛рдпрдж рдХреЗрд╡рд▓ рдкрд╛рдВрдЪ рд╣реА рдЗрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рдкрд╛рдПрдВрдЧреЗ, рдФрд░ рдореИрдВ рдЗрди рдкрд╛рдВрдЪреЛрдВ рдХреЛ рдирд╣реАрдВ рдХрд░рддрд╛ред" рдлрд┐рд░ рднреА, рдПрдХ рджреГрд╖реНрдЯрд╛рдВрдд рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╣ GroupWait рдирд╛рдордХ рдПрдХ рд╡рд╕реНрддреБ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:
- AddWait: рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓ рдЬреЛрдбрд╝реЗрдВред
- SignalAll: рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдИрд╡реЗрдВрдЯ рдХреЛ рдЙрд╕реА рд╕рдордп рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕реЗ рд╡рд╣ рд╕реЗрдЯ рд╣реИред рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рд╕рд┐рдЧреНрдирд▓ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рдСрд▓ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдХреЗрд╡рд▓ рд╣реИрдВрдбрд▓ рдХреА рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреЗрдЪреАрджрд╛, рд╕реНрдиреЗрдкрд▓реЗрд╕ рдореЙрдбрд▓ рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рдВрдбреЛрдЬ рдПрдХреНрд╕рдкреА рдХреЗ рдмрд╛рдж рд╕реЗ рд▓рд╛рдЧреВ рдХреА
рдЧрдИ рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдкрд░рдорд╛рдгреБ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдирдореВрдирд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдореМрдЦрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд╣реА рдХрд╛рд░реНрдп рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реВрдЪреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GroupWait рдХреЛ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рди рд▓реЗрдВред
рддреЛ, рд╣рдо рджреЛ рдЭрдВрдбреЗ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдирд┐рдЪрд▓реЗ рджреЛ рдмрд┐рдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рдПрдХ рдХреИрдкреНрдЪрд░ рдлреНрд▓реИрдЧ, рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдзрд╛рдЧрд╛ рд╕реВрдЪреА рдкрд░ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░ рд░рд╣рд╛ рд╣реИ; рдФрд░ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдИрд╡реЗрдВрдЯ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрдмрдХрд┐ рд╕реВрдЪреА рдХреИрдкреНрдЪрд░ рдХреА рдЬрд╛ рд░рд╣реА рдереАред
// рдЪреЗрддрд╛рд╡рдиреА! рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЖрдИрдбреА рд╣реИрдВ - рдкрд╛рда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдиреЗрдВ
рд╕рдВрд░рдЪрдирд╛ NODE;
NODE * Node (LONG_PTR рдХреБрдВрдЬреА) {рд╡рд╛рдкрд╕реА reinterpret_cast <NODE *> (рдХреБрдВрдЬреА); }
рдПрдирдо {
рд▓реЙрдХреНрдб = 1,
рд╕рдВрдХреЗрддрд┐рдд = 2,
};
рд╕рдВрд░рдЪрдирд╛ NODE {
NODE * pnNext;
рд╣рд╛рде рдХрд╛ рдирд┐рд╢рд╛рди;
LONG_PTR рдХреБрдВрдЬреА () {return reinterpret_cast <LONG_PTR> (рдпрд╣); }
NODE * Ptr () {рд░рд┐рдЯрд░реНрди рдиреЛрдб (рдХреА () рдФрд░ ~ (рд▓реЙрдХреНрдб | рд╕рд┐рдЧреНрдирд▓реЗрдб)); }
};
#define NODE_INVALID рдиреЛрдб (-1)
рд╡рд░реНрдЧ GroupWait {
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ:
GroupWait (): m_pnRoot (NULL) {}
~ рдЧреНрд░реБрдкрд╡рд╛рдЗрдЯ ();
BOOL AddWait (HANDLE hEvent);
рд╢реВрдиреНрдп рд╕рд┐рдЧреНрдирд▓рдЖрд▓ ();
рдирд┐рдЬреА:
NODE * m_pnRoot;
};
рдЪреВрдБрдХрд┐ рд╣рдо рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдХрд┐рд╕реА рд╕реВрдЪреА рдЖрдЗрдЯрдо рдФрд░ рдЭрдВрдбреЗ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рдПрдХ рдореВрд▓реНрдп рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬреЛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ-рджреВрд╕рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
Node
рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ,
Key
рдПрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░
Ptr
рдПрдХ рдЙрдкрдпреЛрдЧреА рдкреЙрдЗрдВрдЯрд░
Ptr
рд╣реИ (рдХрдо рдмрд┐рдЯреНрд╕ рдореЗрдВ рдЭрдВрдбреЗ рдХреЗ рдмрд┐рдирд╛) ред
рд╣рдо рдЕрдкрдиреЗ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рдкрддреНрд░
p|S|L
рдЫреЛрдЯреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рддреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ
p|S|L
: p - рд╕реВрдЪреА рдХреЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ; рдПрд╕ - рдХрд╛рдо рдХрд╛ рдЭрдВрдбрд╛; рдФрд░ L рдХреИрдкреНрдЪрд░ рдлреНрд▓реИрдЧ рд╣реИред рд╕реЗрдЯ рдлреНрд▓реИрдЧ рдПрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ
рдирд┐рдореНрди рд╕реЗ рд╢реБрд░реВ
рд╣реЛрддреА рд╣реИ - рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рддрддреНрд╡ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддреАрд░ рдкрд░ рдЪрд┐рд╣реНрдирд┐рдд рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
m_pnRoot
+ -------- + - + - +
| * | 0 | 1 |
+ --- | ---- + - + - +
|
v
+ -------- + - + - + --------- +
рдП | * | 1 | | | hEvent1 |
+ --- | ---- + - + - + --------- +
|
v
+ -------- + - + - + --------- +
B | * | | | | hEvent2 |
+ --- | ---- + - + - + --------- +
|
v
+ -------- + - + - + --------- +
рд╕реА | рдирд▓ | | | | | hEvent3 |
+ -------- + - + - + --------- +
рдЪрд┐рддреНрд░рд┐рдд рдПрдХ GroupWait рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рддреАрди рд╣реИрдВрдбрд▓ рд╣реИрдВред рд╕реВрдЪреА рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд░реАрд╕реЗрдЯ рдзреНрд╡рдЬ S рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ hEvent1 рдШрдЯрдирд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рддрддреНрд╡ рдП рдореЗрдВ рд╕реЗрдЯ рдлреНрд▓реИрдЧ рдПрд╕ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдП рдХреЗ рдмрд╛рдж рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░реЗрдВ - рдЕрд░реНрдерд╛рддреН, hEvent2 рдФрд░ hEvent3ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рддрддреНрд╡реЛрдВ рдмреА рдФрд░ рд╕реА рдореЗрдВ рдзреНрд╡рдЬ рдПрд╕ рдХрд╛ рдореВрд▓реНрдп рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛; рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рддрддреНрд╡ A рдореЗрдВ S рдзреНрд╡рдЬ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕реВрдЪреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдореЗрдВ S рдзреНрд╡рдЬ рдХрд╛ рдорд╛рди рдХрднреА рднреА рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИред
L рдзреНрд╡рдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕реВрдЪреА рдХреЗ рдкреНрд░рдореБрдЦ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЕрдиреНрдп рд╕рднреА рддрддреНрд╡реЛрдВ рдореЗрдВ рдпрд╣ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
рддреЛ рддреИрдпрд╛рд░реА рдкреВрд░реА рд╣реИ; рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╣реИрдВрдбрд▓ рдЬреЛрдбрд╝реЗрдВред
BOOL GroupWait :: AddWait (рд╣рд╛рде рд╣рд┐рд▓рд╛рдирд╛)
{
NODE * pnInsert = new (nothrow) NODE;
рдЕрдЧрд░ (pnInsert == NULL) FALSE;
pnInsert-> hEvent = hEvent;
NODE * pn;
NODE * pnNew;
рдХрд░реЛ {
pn = InterlockedReadAcquire (& m_pnRoot, NODE_INVALID);
pnInsert-> pnNext = pn;
pnNew = Node (pnInsert-> Key () | (pn-> Key () рдФрд░ Locked));
} рдЬрдмрдХрд┐ (InterlockedCompareExchangeRelease (& m_pnRoot, pnNew, pn)! = pn);
TRUE рд▓реМрдЯрд╛рдУ;
}
рд╣рдо рд╕реВрдЪреА рдореЗрдВ рд╕рдмрд╕реЗ рдКрдкрд░ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ L рдзреНрд╡рдЬ рдкреБрд░рд╛рдиреЗ рддрддреНрд╡ рд╕реЗ рдирдП рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ: рдЕрдиреНрдпрдерд╛ рдпрд╣ рдкрддрд╛ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реВрдЪреА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдЗрд╕реЗ "рдЬрд╛рд░реА" рдХрд░ рджреЗрддреЗ рд╣реИрдВред рдЬреЛрдбрд╝реЗ рдЬрд╛ рд░рд╣реЗ рдЖрдЗрдЯрдо рдореЗрдВ S рдзреНрд╡рдЬ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдХрд┐рд╕реА рдиреЗ рдЕрднреА рддрдХ рдПрдХ рдирдИ рдШрдЯрдирд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдорд╛рдВрдЧ рдирд╣реАрдВ рдХреА рд╣реИред рд╣рдо рд╕реВрдЪреА рдХреЗ рдкреНрд░рдореБрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдкрд░рд┐рдЪрд┐рдд рдореЙрдбрд▓ "рдХрд░реЛ, рд▓рд┐рдЦреЛ, (рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ") рдХреЗ рдЕрдиреБрд╕рд╛рд░ - рдпрд╣ рдЬрд╛рдБрдЪрдирд╛ рдХрд┐ рдХрд┐рд╕реА рдиреЗ рд╣рдорд╛рд░реЗ рдкреАрдЫреЗ рдХреА рд╕реВрдЪреА рдХреЛ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ "ABA рд╕рдорд╕реНрдпрд╛" рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рднрд▓реЗ рд╣реА
m_pnRoot
рдХрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдорд╛рди рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рдо рдЕрднреА рднреА рдХреЗрд╡рд▓ рд╕реВрдЪрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдирд╣реАрдВред
AddWait рдкрджреНрдзрддрд┐ рдХреА рд╕рд░рд▓рддрд╛ "do, write, (рджреВрд╕рд░реЗ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВ)" рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИ: рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ - рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдЦрдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдмрд╛рдХреА рддрд░реАрдХреЛрдВ рдХрд╛ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЛ рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдмрдХрд┐ рдЗрд╕реЗ рдХреИрдкреНрдЪрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рд╕рд┐рдЧреНрдирд▓рдСрд▓ рд╡рд┐рдзрд┐ рдЗрддрдиреА рдЬрдЯрд┐рд▓ рд╣реИ рдХрд┐ рдЗрд╕реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдкрдврд╝рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
рд╢реВрдиреНрдп GroupWait :: SignalAll ()
{
NODE * pnCapture;
NODE * pnNew;
рдХрд░реЛ {
pnCapture = InterlockedReadAcquire (& m_pnRoot, NODE_INVILID);
рдЕрдЧрд░ (pnCapture-> рдХреБрдВрдЬреА () рдФрд░ рд▓реЙрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛) {
pnNew = рдиреЛрдб (pnCapture-> рдХреБрдВрдЬреА () | рд╕рдВрдХреЗрддрд┐рдд);
} {
pnNew = Node (Locked);
}
} рдЬрдмрдХрд┐ (InterlockedCompareExchangeAcquire (& m_pnRoot,)
pnNew, pnCapture); = pnCapture);
рдЕрдЧрд░ (pnCapture-> рдХреБрдВрдЬреА () рдФрд░ рдмрдВрдж) рд╡рд╛рдкрд╕реА;
...
рдпрджрд┐ рд╕реВрдЪреА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд┐рд░ рдореЗрдВ рдзреНрд╡рдЬ S рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред рдпрджрд┐ рд╕реВрдЪреА рдореБрдлрд╝реНрдд рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдкрдХрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╕рд╛рде рд╣реА рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ "рд╕реНрдЯрдм"
NULL|0|1
рд╕реНрдерд╛рди рдкрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕реВрдЪреА рдХреЗ рдкреНрд░рдореБрдЦ рдХреЛ "рдХрд░реЛ, рд▓рд┐рдЦреЛ, (рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЛ)" рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ - рд╣рдо рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд╕рдлрд▓ рд╣реЛрдиреЗ рддрдХ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред
рдПрд╕ рдзреНрд╡рдЬ рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ, рд╣рдордиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рдереНрд░реЗрдб рдХреЛ рд╕реМрдВрдк рджрд┐рдпрд╛ рдЬрд┐рд╕рдиреЗ рд╕реВрдЪреА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ред рд╕реВрдЪреА рдХреЗ рд╕рд┐рд░ рдореЗрдВ рд╕реЗрдЯ S рдзреНрд╡рдЬ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рд╕рд┐рд░ рдХреЗ рдкреАрдЫреЗ - рдЕрд░реНрдерд╛рдд рдЖрдо рддреМрд░ рдкрд░ рд╕реВрдЪреА рдХреЗ рд╕рднреА рддрддреНрд╡; рдмрд╕ рд╣рдореЗрдВ рдЬреЛ рдЪрд╛рд╣рд┐рдПред рд╕реВрдЪреА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдзрд╛рдЧрд╛ рд╕реВрдЪреА рдЬрд╛рд░реА рд╣реЛрдиреЗ рдкрд░ рдзреНрд╡рдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛, рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдпрджрд┐ рд╕реВрдЪреА рдкрд░ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╣рдорд╛рд░реА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рд╣рдордиреЗ рдЗрд╕реЗ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ред рдЪреЛрд░реА рдХрд┐рдП рдЧрдП рд╕рд╛рдорд╛рди рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд╕рд┐рдЧреНрдирд▓рдЖрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдХрдИ рдЗрд╡реЗрдВрдЯ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред
...
NODE * pnNext;
NODE * pn;
for (pn = pnCapture-> Ptr (); pn; pn = pnNext) {
рд╕реЗрдЯрдИрд╡реЗрдВрдЯ (pn-> hEvent);
pnNext = pn-> pnNext-> Ptr ();
рд╣рдЯрд╛рдирд╛;
}
...
"рдЪреЛрд░реА" рд╕реВрдЪреА рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдХреЗ рдереНрд░реЗрдб-рд╕реЗрдлреНрдЯреА рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЪрд┐рдВрддрд╛ рдХреЗ рдмрд┐рдирд╛, рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдмрд╕ рддрддреНрд╡ рд╕реЗ рддрддреНрд╡ рд▓реЗрддреЗ рд╣реИрдВ, рдШрдЯрдирд╛ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рдПрдХрдорд╛рддреНрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐
Ptr
рдХреЛ рдкреЙрдЗрдВрдЯрд░ рд╕реЗ рдЕрдЧрд▓реЗ рддрддреНрд╡ рддрдХ рдЭрдВрдбреЗ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдЕрдм рд╕реВрдЪреА рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:
...
pnCapture = pnNew;
...
рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдордиреЗ
pnNew
рдХреЛ
m_pnRoot
рд▓рд┐рдЦрд╛ рдерд╛, рдФрд░ рдпрджрд┐ рдпрд╣ рдорд╛рди рд╕реВрдЪреА рдХреЗ рдкреНрд░рдореБрдЦ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╣рдо рдЖрд╕рд╛рди рд╣реЛ рдЧрдП: рдЬрдм рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рдереЗ, рддреЛ рдХрд┐рд╕реА рдиреЗ рднреА рдЗрд╕ рд╕реВрдЪреА рдХреЛ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ред
...
рдХреЗ рд▓рд┐рдП (;)) {
pnNew = Node (pnCapture-> Key () & ~ рд▓реЙрдХреНрдб);
рдпрджрд┐ (InterlockedCompareExchangeRelease (& m_pnRoot)
pnNew, pnCapture) == pnCapture) {
рд╡рд╛рдкрд╕реА;
}
...
рдкрд╣рд▓реЗ, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╕реВрдЪреА рдмрджрд▓ рдЧрдИ рд╣реИ: рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдмрд╕ рдЗрд╕реЗ рдЕрдирдмреНрд▓реЙрдХ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рдо рд╣реЛ рдЧрдпрд╛ред рдЕрдиреНрдпрдерд╛, рд╣рдо рдПрдХ рдирдпрд╛ рдЪрдХреНрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рдЖрдкрдХреЛ рдЙрди рд╕рднреА рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рд╕реВрдЪреА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЬрдорд╛ рд╣реБрдП рд╣реИрдВред
...
pnCapture = InterlockedReadAcquire (& m_pnRoot, NODE_INVILID);
NODE * pnNew = рдиреЛрдб (pnCapture-> рдХреБрдВрдЬреА () рдФрд░ ~ (рд▓реЙрдХ | рд╕рд┐рдЧреНрдирд▓реЗрдб)));
NODE ** ppn = & pnNew;
NODE * pn;
NODE * pnNext;
BOOL fSignalSeen = FALSE;
for (pn = pnNew; pn-> Ptr (); pn = pnNext) {
pnNext = pn-> Ptr () -> pnNext;
рдЕрдЧрд░ (fSignalSeen) {
рд╕реЗрдЯрдЗрд╡реЗрдВрдЯ (pn-> Ptr () -> hEvent);
рд╣рдЯрд╛рдирд╛ pn-> Ptr ();
} рдФрд░ рдпрджрд┐ (pn-> рдХреБрдВрдЬреА () рдФрд░ рд╕рдВрдХреЗрддрд┐рдд) {
fSignalSeen = TRUE;
(* рдкреАрдкреАрдПрди) = рдиреЛрдб (рдмрдВрдж); // рдЪреЛрд░реА, рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдХрдмреНрдЬрд╛
рд╕реЗрдЯрдЗрд╡реЗрдВрдЯ (pn-> Ptr () -> hEvent);
рд╣рдЯрд╛рдирд╛ pn-> Ptr ();
} {
ppn = & pn-> Ptr () -> pnNext;
}
}
} // рдлрд┐рд░ рд╕реЗ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
} // рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдВрдд
рд▓рдВрдмрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕реВрдЪреА рдореЗрдВ рдЪрд╛рд░реЛрдВ рдУрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рд╕реЗрдЯ рдмрд┐рдЯ рдПрд╕ рдирд╣реАрдВ рдкрд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рддрддреНрд╡, рдЬрд┐рд╕рдореЗрдВ рдмрд┐рдЯ рдПрд╕ рд╕реЗрдЯ рд╣реИ, рд╣рдо рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдмрд╛рдХреА рд╕реВрдЪреА рдХреЛ "рдЪреЛрд░реА" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░реАрд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ; рдлрд┐рд░, рдЗрд╕ рд╢реЗрд╖ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдИрд╡реЗрдВрдЯ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдЗрдЯрдо рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рд╣рдо рд╕реВрдЪреА рдХреЛ "рдЪреБрд░рд╛" рд░рд╣реЗ рд╣реИрдВ рддрд╛рдХрд┐ рдПрдХ рд╕рд╛рде рдХрдИ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдкрд░ рдИрд╡реЗрдВрдЯ рдХреА рдПрдХрд╛рдзрд┐рдХ рд╕реНрдерд╛рдкрдирд╛ рди рд╣реЛред рдЕрдВрдд рдореЗрдВ, рдЬрдм рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдо рдлрд┐рд░ рд╕реЗ рд╕реВрдЪреА рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ - рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдХрд┐ рдПрдХ рджрд┐рди рдХреЛрдИ рдирдпрд╛ рдХрд╛рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдФрд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, "рдЗрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕реЗ рд▓рд┐рдЦреЗрдВ (рдЗрд╕реЗ рджреВрд╕рд░реЗ рдХреЛ рд╕реМрдВрдкреЗрдВ)" рдореЙрдбрд▓ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ, рд╕рднреА рд╕реВрдХреНрд╖реНрдорддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рд╕рд┐рд░ рдХреЛ рдЪреЛрдЯ рд▓рдЧ рд╕рдХрддреА рд╣реИред рд╕рд┐рд╕реНрдЯрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЫреЛрдбрд╝рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдЗрд╕ рд╕рдм рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп, рдзреИрд░реНрдп рдФрд░ рдХреНрд╖рдорддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдЕрд░реБрдг рдХрд┐рд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ
: рд╡рд┐рдВрдбреЛрдЬ 7 рдХреЗ рдЕрдВрджрд░ - рд╡рд┐рдВрдбреЛрдЬ рдХрд░реНрдиреЗрд▓ рдбрд┐рд╕реНрдкреИрдЪрд░ рд▓реЙрдХ рд╕реЗ рд╡рд┐рджрд╛рдИ , рдПрдХ рд╡рд┐рдВрдбреЛрдЬ рдХрд░реНрдиреЗрд▓ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╡рд╛рд╕реНрддреБрдХрд╛рд░ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИред