.NET: рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгред рднрд╛рдЧ реи

рдореИрдВ рд╣реЗрдмрд░ рдкрд░ рдореВрд▓ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХреЛрдбрд┐рдВрдЧрд╕рд╛рдЗрдЯ рдмреНрд▓реЙрдЧ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдореАрдЯрд┐рдВрдЧ рдореЗрдВ рдЕрдкрдиреА рдмрд╛рдд рдХрд╛ рдПрдХ рдкрд╛рда рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рдкрд╣рд▓рд╛ рднрд╛рдЧ рдпрд╣рд╛рдБ рдпрд╛ рдпрд╣рд╛рдБ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ , рдпрд╣ рдПрдХ рдзрд╛рдЧрд╛ рдпрд╛ рдЯрд╛рд╕реНрдХ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдореВрд▓ рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдерд╛, рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рддрд░реАрдХреЗ рдФрд░ PLinq рдЬреИрд╕реА рдХреБрдЫ рдореАрдареА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЗред

рд╕рд╛рдордЧреНрд░реА





рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдпрд╣ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рднреА рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рд╣реЛрдЧрд╛: рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдЖрдкрдХреЗ рдЕрдореВрд░реНрдд рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрддрд░ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрднреА рднреА рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕рд╛рдзрди рд╣реИред рдореИрдВ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛:

рдЙрджрд╛рд╣рд░рдг # 1:

рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдбрд░ рд╕реЗ, рдЖрдкрдиреЗ рдереНрд░реЗрдб рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ред рдлрд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпрд╣ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдПрдХ рднреА рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИред

рдХрдИ рд╕реНрддрд░реЛрдВ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╣рд╛рд░реНрдб рдбреНрд░рд╛рдЗрд╡ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЪрд╛рд▓рдХ рдпрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрд╕реЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг # 2:

рдЙрджрд╛рд╣рд░рдг # 1 рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдкрдиреЗ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд┐рдореЛрдЯ рдорд╢реАрдиреЛрдВ рдкрд░ рд░рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рджреЛ рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рд▓реЛрд╣реЗ рдФрд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЯреБрдХрдбрд╝реЗ рдереЗред рд╣рдо рдПрдлрд╝рдЯреАрдкреА рдпрд╛ рдПрдирдПрдлрдПрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдиреЗрдХреНрд╢рди рд░рдЦрддреЗ рд╣реИрдВред

рдиреАрдЪреЗ рдХрдИ рд╕реНрддрд░реЛрдВ рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдпрд╛ рдорд╢реАрди рдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдЬрд┐рд╕ рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдЙрд╕реЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкрд╣реБрдВрдЪ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг # 3:

рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдореЗрдВ рдЖрдкрдХреЗ рдмрд╛рд▓реЛрдВ рдХрд╛ рдХрд╛рдлреА рд╣рд┐рд╕реНрд╕рд╛ рдЦреЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдордирд╛ рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдЧрдгрдирд╛ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рдд рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдВрдХ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

рдореИрдВ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рддрд╛рдмреВрдд рдореЗрдВ рдЕрдВрддрд┐рдо рджрд░реНрдЬрди рдирд╛рдЦреВрдиреЛрдВ рдХреЛ рд╣рдереМрдбрд╝рд╛ рджреЗрддрд╛ рд╣реВрдВ: рдПрдХ рд░рдирдЯрд╛рдЗрдо рдФрд░ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░, рдереНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓рд░, рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рд░реИрдо рдФрд░ рдореЗрдореЛрд░реА, рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЕрднреА рднреА рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рд╕рдВрдкреВрд░реНрдг рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рд╕реНрдЯреИрдХ рдХреА рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдЕрдореВрд░реНрдд рдХреЗ рд╕рднреА рд╕реНрддрд░реЛрдВ рдкрд░ рдПрдХ рднреА рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдмрд┐рдирд╛ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рд╕реНрддрд░реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдкрд╣реБрдВрдЪ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдмрд╕ рдЗрд╕реЗ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг: рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рднреА рдпреВрдЖрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдордирд╛ рдХрд░рддрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЕрдХреНрд╕рд░ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдкрд░ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЖрдкрдХрд╛ рд╕реНрддрд░ред рдЙрдиреНрд╣реЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреБрд▓реНрдпрдХрд╛рд▓рди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдкрд░рд┐рдЪрдпред

рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ


рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрдИ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдХреНрд░реИрд╢ рдпрд╛ рдлреНрд░реАрдЬред
  2. рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЧрд▓рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред
  3. рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рдЧреИрд░-рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рддрд╛ рд╣реИ рдпрд╛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рджреЛ рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛рдПрдВ 1 рдФрд░ 2 рдХреЗ рдХрд╛рд░рдг рдЧрддрд┐рд░реЛрдз рдФрд░ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реЛрддреА рд╣реИ ред

рдЧрддрд┐рд░реЛрдз


рдЧрддрд┐рд░реЛрдз - рдЧрддрд┐рд░реЛрдзред рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╡рд┐рдзрддрд╛рдПрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:



рдЬрдмрдХрд┐ рдереНрд░реЗрдб # 1 рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рдерд╛, рдереНрд░реЗрдб # 2 рдЕрд╡рд░реБрджреНрдз рд╕рдВрд╕рд╛рдзрди рдмреА , рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдереНрд░реЗрдб # 1 рдЕрд╡рд░реБрджреНрдз рд╕рдВрд╕рд╛рдзрди рдП рдФрд░ рд╕рдВрд╕рд╛рдзрди рдмреА рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдРрд╕рд╛ рдХрднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдереНрд░реЗрдб # 2 рд╕рдВрд╕рд╛рдзрди рдП рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕рдВрд╕рд╛рдзрди рдП рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ ред

рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐


рджреМрдбрд╝-рд╣рд╛рд▓рдд - race conditionред рд╡рд╣ рд╕реНрдерд┐рддрд┐ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдЧрдгрдирд╛рдУрдВ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд░рди-рдЯрд╛рдЗрдо рдереНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдХрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреА рдЕрдкреНрд░рд┐рдпрддрд╛ рдЗрд╕ рддрдереНрдп рдореЗрдВ рдареАрдХ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╕реМ рдореЗрдВ рд╕реЗ рдПрдХ рдмрд╛рд░ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдерд┐рддрд┐ рдЗрд╕ рддрдереНрдп рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛рдПрдВ рдПрдХ рд╕рд╛рде рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: рдереНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓рд░ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде, рдПрдХ рдЧрддрд┐рд░реЛрдз рд╣реЛрддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рдЗрди рджреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдРрд╕реЗ рднреА рд╣реИрдВ рдЬреЛ рдПрдХ рдЧрд▓рдд рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рдпрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╢рдХреНрддрд┐ рдЦрд░реНрдЪ рдХреА рдЬрд╛рдПрдЧреАред рдЗрдирдореЗрдВ рд╕реЗ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ: рд╡реНрдпрд╕реНрдд рдкреНрд░рддреАрдХреНрд╖рд╛ рдФрд░ рдереНрд░реЗрдб рднреБрдЦрдорд░реА ред

рд╡реНрдпрд╕реНрдд-рдкреНрд░рддреАрдХреНрд╖рд╛


рд╡реНрдпрд╕реНрдд-рдкреНрд░рддреАрдХреНрд╖рд╛ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЦрдкрдд рдХрд░рддрд╛ рд╣реИред

рдЕрдХреНрд╕рд░ рдХреЛрдб рдореЗрдВ рдРрд╕реА рд╕рдорд╕реНрдпрд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

while(!hasSomethingHappened) ; 

рдпрд╣ рдмреЗрд╣рдж рдЦрд░рд╛рдм рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрдкрдпреЛрдЧреА рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реБрдП рдЖрдкрдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдПрдХ рдХреЛрд░ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдЙрдЪрд┐рдд рдФрд░ рдЙрдЪрд┐рдд рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдмреЛрд▓рддреЗ рд╣реБрдП, рдореИрдВ рдЙрд╕ рдорд╛рдорд▓реЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬрдм рдЖрдк рдХреБрдЫ рдиреИрдиреЛрд╕реЗрдХрдВрдб рднреА рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрд░реНрдерд╛рддреН, рдПрдХ рд╕реНрд╡рд╕реНрде рдорд╕реНрддрд┐рд╖реНрдХ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдореЗрдВ, ResetEvent рдХрд┐рд╕реНрдореЛрдВ рдФрд░ рдЙрдирдХреЗ рд╕реНрд▓рд┐рдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реИред рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдиреАрдЪреЗред

рд╢рд╛рдпрдж рдкрд╛рдардХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд▓реВрдк рдХреЗ рд▓рд┐рдП Thread.Sleep (1) рдЬреИрд╕реЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдмреЗрдХрд╛рд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдХреЛрд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреЗрдЧрд╛ред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдмрдирд╛ рджреЗрдЧрд╛: рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдФрд╕рдд рдЖрдзрд╛ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдкрд░ рд╣реЛрдЧрд╛, рдЬреЛ рдХрд┐ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕реЗ рднреА рдЕрдзрд┐рдХ рднрдпрд╛рд╡рд╣ рд░реВрдк рд╕реЗ рд░реАрд╕реЗрдЯ рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдзрд╛рдЧрд╛ рднреБрдЦрдорд░реА


рдереНрд░реЗрдб-рднреБрдЦрдорд░реА рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдкреНрд░рд╡рд╛рд╣ рдЬреЛ рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реИрдВ, рдФрд░ рди рдХрд┐ рдХрд┐рд╕реА рдЖрдИрдУ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде, рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдЦреЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд╡реНрдпрддреАрдд рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдлрд╛рдЗрд▓рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдиреАрдЪреЗ рдЯрд╛рдЗрдорд▓рд╛рдЗрди рдореЛрдб рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдбреЙрдЯрдЯрд╛рдЗрдЯрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рд╕реЗ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред


(рдЫрд╡рд┐ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ)

рдЙрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЬреЛ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рднреВрдЦ рд╕реЗ рдЧреНрд░рд╕реНрдд рдирд╣реАрдВ рд╣реИ, рд░реЗрдЦрд╛рдВрдХрди рдкрд░ рдЧреБрд▓рд╛рдмреА рд░рдВрдЧ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╢реНрд░реЗрдгреА рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ 30.6% рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реАрдкреАрдпреВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рдерд╛ред

рдЬрдм рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЖрдкрдиреЗ рдПрдХ рд╕рдордп рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд┐рдП, рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдо рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╢реБрд░реВ рдХрд░реЗрдВред

рд╕рд┐рдВрдХ рдЙрдкрдХрд░рдг



Interlocked


рдпрд╣ рд╢рд╛рдпрдж рд╕рд┐рдВрдХ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╣рд▓реНрдХрд╛ рддрд░реАрдХрд╛ рд╣реИред рдЗрдВрдЯрд░рд▓реЙрдХреНрдб рд╕рд░рд▓ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рдордп рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред .NET рдореЗрдВ, рдЗрдВрдЯрд░рд▓реЙрдХ рдХреЛ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕реНрдерд┐рд░ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдХрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдЧреИрд░-рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХреА рднрдпрд╛рд╡рд╣рддрд╛ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 10 рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╣реА рдЪрд░ рдХреА рдПрдХ рд▓рд╛рдЦ рд╡реГрджреНрдзрд┐ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдХрд╛рдо рдХреЗ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ - рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдпрд╣ 10 рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЕрдзрд┐рдХ рднрд┐рдиреНрди рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд░рдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдСрдкрд░реЗрд╢рди рднреА рдкрд░рдорд╛рдгреБ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдореЗрдореЛрд░реА рд╕реЗ рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓рдиреЗ, рдПрдХ рдирдП рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рджреЛ рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде рдЗрди рдСрдкрд░реЗрд╢рдиреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдЦреЛ рдЬрд╛рдПрдЧреАред

рдЗрдВрдЯрд░рд▓реЙрдХреНрдб рдХреНрд▓рд╛рд╕ рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ / рдбрд┐рдХреНрд░реАрдореЗрдВрдЯ рдореЗрдердб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ; рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред рдРрд╕рд╛ рдХреЛрдб рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдЗрдВрдЯрд░рд▓реЙрдХреНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ 10 рдорд┐рд▓рд┐рдпрди рдХреЛ рдмрд╛рд╣рд░ рдХрд░ рджреЗрдЧрд╛ред

рддреБрд▓рдирд╛ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рдзрд┐ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рднреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЖрдкрдХреЛ рдХрдИ рджрд┐рд▓рдЪрд╕реНрдк рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓реЙрдХ-рдлрд╝реНрд░реА рдкрд░рд┐рд╡рд╛рд░ред

 public static int CompareExchange (ref int location1, int value, int comparand); 

рд╡рд┐рдзрд┐ рддреАрди рдорд╛рди рд▓реЗрддреА рд╣реИ: рдкрд╣рд▓реЗ рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╡рд╣ рдорд╛рди рд╣реИ рдЬрд┐рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрджрд┐ рддреБрд▓рдирд╛ рдХреЗ рд╕рдордп рд╕реНрдерд╛рди 1 рддреБрд▓рдирд╛ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдерд╛рди 1 рдХрд╛ рдореВрд▓ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рднреНрд░рд╛рдордХ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХреЛрдб рд▓рд┐рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдЬреЛ рддреБрд▓рдирд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╕рдВрдЪрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ:

 var original = location1; if (location1 == comparand) location1 = value; return original; 

рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рд▓рд╛рдХреНрдб рдХреНрд▓рд╛рд╕ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░рдорд╛рдгреБ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдо рдЦреБрдж рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд┐рддрд┐ рд╕реНрдерд╛рди 1 == рддреБрд▓рдирд╛ рд╣реЛрдиреЗ рдкрд░ рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рд╕реНрдерд╛рди 1 = рдорд╛рди рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреА, рддрдм рддрдХ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рд╕реНрдерд╛рди 1 рдХрд╛ рдорд╛рди рдмрджрд▓ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЦреЛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдХреЛрдб рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд┐рд╕реА C # рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рдПрдХ MyEvent рдИрд╡реЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВ:

 class MyClass { public event EventHandler MyEvent; } 

рдЪрд▓реЛ рд░рд┐рд▓реАрдЬрд╝ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдбреЙрдЯрдкреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ:

 [CompilerGenerated] private EventHandler MyEvent; public event EventHandler MyEvent { [CompilerGenerated] add { EventHandler eventHandler = this.MyEvent; EventHandler comparand; do { comparand = eventHandler; eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.MyEvent, (EventHandler) Delegate.Combine((Delegate) comparand, (Delegate) value), comparand); } while (eventHandler != comparand); } [CompilerGenerated] remove { // The same algorithm but with Delegate.Remove } } 

рдпрд╣рд╛рдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ, рд╕рдВрдХрд▓рдХ рдиреЗ рдПрдХ рдмрд▓реНрдХрд┐ рдкрд░рд┐рд╖реНрдХреГрдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ред рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдПрдХ рдШрдЯрдирд╛ рд╕рджрд╕реНрдпрддрд╛ рдХреЛ рдЦреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ рдЬрдм рдХрдИ рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде рдЗрд╕ рдШрдЯрдирд╛ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЬреЛрдбрд╝ рд╡рд┐рдзрд┐ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ, рдпрд╣ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рддреБрд▓рдирд╛рддреНрдордХ рдкрджреНрдзрддрд┐ рдХреНрдпрд╛ рдХрд░рддреА рд╣реИ

 EventHandler eventHandler = this.MyEvent; EventHandler comparand; do { comparand = eventHandler; // Begin Atomic Operation if (MyEvent == comparand) { eventHandler = MyEvent; MyEvent = Delegate.Combine(MyEvent, value); } // End Atomic Operation } while (eventHandler != comparand); 

рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереЛрдбрд╝рд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд░реВрдВрдЧрд╛:

рдпрджрд┐ MyEvent рдЕрднреА рднреА рд╡реИрд╕реА рд╣реА рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЙрд╕ рд╕рдордп рдерд╛ рдЬрдм рд╣рдордиреЗ Delegate.Combine рдХреЛ рдЪрд▓рд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдерд╛, рддреЛ рдЗрд╕рдореЗрдВ рдиреАрдЪреЗ рд▓рд┐рдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ Delegate.Combine рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛, рдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреЛрд╣рд░рд╛рдПрдВред


рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдШрдЯрдирд╛ рд╕рджрд╕реНрдпрддрд╛ рдирд╣реАрдВ рдЦреЛ рдЬрд╛рдПрдЧреАред рдпрджрд┐ рдЖрдк рдЕрдЪрд╛рдирдХ рдПрдХ рдбрд╛рдпрдирд╛рдорд┐рдХ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд▓реЙрдХ-рдлреНрд░реА рд╕рд░рдгреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдХрдИ рдзрд╛рд░рд╛рдПрдБ рдЗрд╕рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╛рдЧрддреА рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЗрди рд╕рднреА рдХреЛ рдЕрдВрдд рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред

рдореЙрдиреАрдЯрд░.рдЗрдВрдЯрд░, рдореЙрдиреАрдЯрд░ред рдПрдХреНрд╕рд┐рдЯ, рд▓реЙрдХ


рдпреЗ рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рд░реНрдорд╛рдг рд╣реИрдВред рд╡реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдЕрд░реНрдерд╛рддреН, рдореЙрдирд┐рдЯрд░ рдХреЗ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдХреЛрдбред рдореЙрдирд┐рдЯрд░, рдореЙрдирд┐рдЯрд░ред рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдПрдХ рд╕рдордп рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЛрд╢рд┐рд╢ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдкрдЯреА рд╣реБрдИ Enter / Exit рдХреЙрд▓реНрд╕ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕рд┐рдВрдереИрдЯрд┐рдХ рд╢реБрдЧрд░ рд╣реИред .NET рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рд╣реА рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВрдЧреЗ:

 lock(a) { lock (a) { ... } } 

рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдХреЙрд▓-рд╕реНрдЯреИрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдЖрдкрдХреЛ рдХреБрдЫ ifs рдмрдЪрд╛ рд╕рдХрддреА рд╣реИред рдРрд╕реА рдЪрд╛рд▓ рдХреЛ рд╕рдВрднрд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, .NET рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдХ рдкреНрд░рддрд┐рдмрдВрдз рдЬреЛрдбрд╝рдирд╛ рдкрдбрд╝рд╛ - рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджрд░реНрдн рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХрдИ рдмрд╛рдЗрдЯреНрд╕ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╕реНрдЯреНрд░реАрдо рдЖрдЗрдбреЗрдВрдЯрд┐рдлрд╝рд╛рдпрд░ рд▓рд┐рдЦрд╛ рдЬрд╛рдПрдЧрд╛ред

C # рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреА рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реАрдорд╛ рд▓рдЧрд╛рддреА рд╣реИ: рдЖрдк рд▓реЙрдХ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХреЗ рдЕрдВрджрд░ рд╡реЗрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдЪреМрдВрдХрд╛ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реА рддрд░рд╣ рдХреА рдПрдХ рдХреЛрд╢рд┐рд╢ рдЖрдЦрд┐рд░рдХрд╛рд░ рдореЙрдирд┐рдЯрд░ред рдПрдиреАрдЯрд░ / рдПрдХреНрдЬрд╝рд┐рдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХрдВрдкрд╛рдЗрд▓ред рдорд╛рдорд▓рд╛ рдХреНрдпрд╛ рд╣реИ? рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЛ рдлрд┐рд░ рд╕реЗ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрд╕рдХреНрдпреВрдПрди / рд╡реЗрдЯ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдЬреНрдЮрд╛рди рдЬреЛрдбрд╝реЗрдВ: рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж рдХреЛрдб рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрдВрддрдЬрд╛рд░ рдХреЗ рдкрд╣рд▓реЗ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рдереНрд░реЗрдб рдкрд░ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдпрд╣ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рдФрд░ рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ConfigureAwait рдХреЛ рдХреЛрдИ рдХреЙрд▓ рдирд╣реАрдВред рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ Monitor.Exit Monitor.Enter рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдереНрд░реЗрдб рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ SynchronizationLockException рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдВрд╕реЛрд▓ рдХреЛрдб рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдпрд╣ рдПрдХ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рдиLockException рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред

 var syncObject = new Object(); Monitor.Enter(syncObject); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); await Task.Delay(1000); Monitor.Exit(syncObject); Console.WriteLine(Thread.CurrentThread.ManagedThreadId); 

рдпрд╣ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рд╣реИ рдХрд┐ WinForms рдпрд╛ WPF рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдпрд╣ рдХреЛрдб рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдЗрд╕реЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рдВрджрд░реНрдн рд╣реЛрдЧрд╛ рдЬреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдмрд╛рдж UI-рдереНрд░реЗрдб рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░рддреАрдХреНрд╖рд┐рдд рдСрдкрд░реЗрдЯрд░ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

.NET рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред .NET рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рджреЛ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╕реНрдкрд┐рди-рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЛрдб рдФрд░ рдХрд░реНрдиреЗрд▓ рдореЛрдбред рд╕реНрдкрд┐рди-рд╡реЗрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЫрджреНрдо рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 while(!TryEnter(syncObject)) ; 

рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдХрдо рд╕рдордп рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдкрд░ рд╕рдмрд╕реЗ рддреЗрдЬреА рд╕реЗ рдХрдмреНрдЬрд╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐ рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди рдЕрднреА рд╡реНрдпрд╕реНрдд рд╣реИ, рддреЛ рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рдереЛрдбрд╝реЗ рд╕рдордп рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдереНрд░реЗрдб рдХрд░реНрдиреЗрд▓ рдореЛрдб рдореЗрдВ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рддрд░рд╣, рд╕рдордп рд▓реЗрддрд╛ рд╣реИред .NET рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЫреЛрдЯреЗ рд▓реЙрдХ рдкрд░рд┐рджреГрд╢реНрдп рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрджрд┐ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЙрдЪреНрдЪ рдФрд░ рдЕрдЪрд╛рдирдХ рд╕реАрдкреАрдпреВ рд▓реЛрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдкрд┐рдирд▓реЙрдХ, рд╕реНрдкрд┐рдирд╡рд╛рдЗрдЯ


рдЪреВрдВрдХрд┐ рдореИрдВрдиреЗ рд╕реНрдкрд┐рди-рд╡реЗрдЯ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ BCL SpinLock рдФрд░ SpinWait рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдЧрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛ рдмрд╣реБрдд рдЬрд▓реНрджреА рддрд╛рд▓рд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реЛрдЧрд╛ред рджреВрд╕рд░реА рдУрд░, рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдиреНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ рдЬреЛ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рдЕрдбрд╝рдЪрди рд╣реИред

рдореЙрдиреАрдЯрд░.рд╡реЗрдЯ, рдореЙрдиреАрдЯрд░.рдкрд▓реНрд╕


рддрд░реАрдХреЛрдВ рдХреА рдЗрд╕ рдЬреЛрдбрд╝реА рдХреЛ рдПрдХ рд╕рд╛рде рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрдирдХреА рдорджрдж рд╕реЗ, рд╡рд┐рднрд┐рдиреНрди рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ - рдПрдХ рдмрд╣реБ-рдкреНрд░рдХреНрд░рд┐рдпрд╛ / рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдЬреЛ рдбреЗрдЯрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдереНрд░реЗрдбреНрд╕ / рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ / рдереНрд░реЗрдбреНрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рд╛рдЭрд╛ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдЗрди рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рддрднреА рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЬреЛ рдзрд╛рдЧрд╛ рдЙрдиреНрд╣реЗрдВ рдкреИрджрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдлрд┐рд▓рд╣рд╛рд▓ рддрд╛рд▓рд╛ рд╣реИред рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рд▓реЙрдХ рдХреЛ рдЬрд╛рд░реА рдХрд░рддреА рд╣реИ рдФрд░ рддрдм рддрдХ рд▓рдЯрдХрд╛рддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдФрд░ рдзрд╛рдЧрд╛ рдкрд▓реНрд╕ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ред

рдХрд╛рдо рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрд╛:

 object syncObject = new object(); Thread t1 = new Thread(T1); t1.Start(); Thread.Sleep(100); Thread t2 = new Thread(T2); t2.Start(); 

(рдореИрдВ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХреНрд░рдо рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рдерд╛, рдкрд╛рда рдХрд╛ рдирд╣реАрдВред

рдкрд╛рд░реНрд╕: рджреВрд╕рд░реА рдзрд╛рд░рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ 100 рдореАрдЯрд░ рдХреА рджреЗрд░реА рд╕реЗрдЯ рдХрд░реЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЗрд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдмрд╛рдж рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
- T1: рд▓рд╛рдЗрди # 2 рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ
- T1: рд▓рд╛рдЗрди # 3 рд╕реНрдЯреНрд░реАрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИ
- T1: рд▓рд╛рдЗрди # 6 рд╕реНрдЯреНрд░реАрдо рд╕реЛ рдЬрд╛рддреА рд╣реИ
- T2: рд▓рд╛рдЗрди # 3 рд╕реНрдЯреНрд░реАрдо рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ
- T2: рд▓рд╛рдЗрди # 4 рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ
- T1: рд▓рд╛рдЗрди # 7 рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд╕реЗрдХреНрд╢рди рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд▓реНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ
- T2: рд▓рд╛рдЗрди # 8 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИ
- рдЯреА 2: рдкрд▓реНрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЗрди # 11 рдЯреА 1 рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ
- T2: рд▓рд╛рдЗрди # 14 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред рддрдм рддрдХ, T1 рдирд┐рд╖реНрдкрд╛рджрди рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред
- T1: рд▓рд╛рдЗрди # 15 рдЬрд╛рдЧрддрд╛ рд╣реИ
- T1: рд▓рд╛рдЗрди # 16 рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ

MSDN рдореЗрдВ рдкрд▓реНрд╕ / рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯрд┐рдкреНрдкрдгреА рд╣реИ, рдЕрд░реНрдерд╛рддреН: рдореЙрдирд┐рдЯрд░ рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдкрд▓реНрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЧрддрд┐рд░реЛрдз рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рд╕реНрдерд┐рддрд┐ рд╕рдВрднрд╡ рд╣реИ, рддреЛ ResetEvent рдкрд░рд┐рд╡рд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдкрд┐рдЫрд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЙрдирд┐рдЯрд░ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рддреАрдХреНрд╖рд╛ / рдкрд▓реНрд╕ рддрд░реАрдХреЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдкреНрд░рд╢реНрди рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдмреНрд▓реЙрдХрд┐рдВрдЧрдХреНрдпреВ рдХреЗ рдРрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдЧрд╛ <T>, рджреВрд╕рд░реА рдУрд░, System.Collections.Concurrent рд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

ReaderWriterLockSlim


рдпрд╣ рдореЗрд░рд╛ рдкреНрд░рд┐рдп рддреБрд▓реНрдпрдХрд╛рд▓рди рдЖрджрд┐рдо рд╣реИ, рдЬреЛ рдЗрд╕реА рдирд╛рдо рдХреЗ System.Threading рдирд╛рдо рд╕реНрдерд╛рди рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмреЗрд╣рддрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдЕрдЧрд░ рдЙрдирдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдХ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рд╡рд┐рдЪрд╛рд░: рдХрдИ рд╕реВрддреНрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд▓рд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рд╕реНрдЯреНрд░реАрдо рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ, рдирдП рд░реАрдбрд┐рдВрдЧ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ, рд▓реЗрдХрд┐рди рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдкреВрд░реА рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЕрдкрдЧреНрд░реЗрдбреЗрдмрд▓-рд░реАрдб-рд▓реЙрдХ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рднреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдк рдкрдврд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд▓реЙрдХ рдХреЛ рдПрдХ рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рди рдореЗрдВ рд░рд╛рдЗрдЯ-рд▓реЙрдХ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

System.Threading рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ ReadWriteLock рд╡рд░реНрдЧ рднреА рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирдП рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЕрддреНрдпрдзрд┐рдХ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИред рд╕реНрд▓рд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдЧрддрд┐рд░реЛрдз рдХреА рдУрд░ рд▓реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдорд╛рдорд▓реЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдпрд╣ рдЖрдкрдХреЛ рд▓реЙрдХ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкрдХрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд░реНрдиреЗрд▓ рдореЛрдб рдХреЗ рд▓рд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдкрд┐рди-рд╡реЗрдЯ рдореЛрдб рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд╕рдордп рдЖрдк рдЕрднреА рддрдХ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдереЗ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рддрд╛рд▓реЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред

ReaderWriterLockSlim рд╡рд░реНрдЧ рдХрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╢рд╛рдпрдж рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 var @lock = new ReaderWriterLockSlim(); @lock.EnterReadLock(); try { // ... } finally { @lock.ExitReadLock(); } 

рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рд╡рд░реНрдЧ рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдкрд╕рдВрдж рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИред
рдЖрдЗрдбрд┐рдпрд╛: рд░реАрдб / рд░рд╛рдЗрдЯрд▓реИрдХ рдореЗрдердб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдбрд┐рд╕реНрдкреЛрдЬрд▓ рд╡рд┐рдзрд┐ рд╕реЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдХ рд╕реЗ рд╢рд╛рдпрдж рд╣реА рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред

 class RWLock : IDisposable { public struct WriteLockToken : IDisposable { private readonly ReaderWriterLockSlim @lock; public WriteLockToken(ReaderWriterLockSlim @lock) { this.@lock = @lock; @lock.EnterWriteLock(); } public void Dispose() => @lock.ExitWriteLock(); } public struct ReadLockToken : IDisposable { private readonly ReaderWriterLockSlim @lock; public ReadLockToken(ReaderWriterLockSlim @lock) { this.@lock = @lock; @lock.EnterReadLock(); } public void Dispose() => @lock.ExitReadLock(); } private readonly ReaderWriterLockSlim @lock = new ReaderWriterLockSlim(); public ReadLockToken ReadLock() => new ReadLockToken(@lock); public WriteLockToken WriteLock() => new WriteLockToken(@lock); public void Dispose() => @lock.Dispose(); } 

рдЗрд╕ рддрд░рд╣ рдХреА рдЯреНрд░рд┐рдХ рдЖрдкрдХреЛ рдмрд╕ рдЖрдЧреЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ:

 var rwLock = new RWLock(); // ... using(rwLock.ReadLock()) { // ... } 


рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ рдкрд░рд┐рд╡рд╛рд░


рдореИрдВ рдЗрд╕ рдкрд░рд┐рд╡рд╛рд░ рдХреЛ ManualResetEvent, ManualResetEventSlim, AutoResetEvent рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддрд╛ рд╣реВрдВред
ManualResetEvent рдХреНрд▓рд╛рд╕реЗрд╕, рдЗрд╕рдХрд╛ рд╕реНрд▓рд┐рдо рд╡рд░реНрдЬрди рдФрд░ AutoResetEvent рдХреНрд▓рд╛рд╕ рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ:
- рдЧреИрд░-рд╕рдВрдХреЗрддрд┐рдд, рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдЬрд┐рдиреНрд╣реЗрдВ WaitOne рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рд╕рд┐рдЧреНрдирд▓ рд╕реНрдЯреЗрдЯ рдХреА рдШрдЯрдирд╛ рдХреЗ рд╕рдВрдХреНрд░рдордг рддрдХ рд▓рдЯрдХрд╛ рд░рд╣рддрд╛ рд╣реИред
- рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐ (рд╕рдВрдХреЗрддрд┐рдд), рдЗрд╕ рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд╕рднреА рд╡рд╛рдЯреНрд╕рдПрдк рдХреЙрд▓ рдкрд░ рд▓рдЯрдХреЗ рд╣реБрдП рдкреНрд░рд╡рд╛рд╣ рдЬрд╛рд░реА рд╣реЛрддреЗ рд╣реИрдВред рд░рди-рдбрд╛рдЙрди рдЗрд╡реЗрдВрдЯ рдореЗрдВ рд╕рднреА рдирдП WaitOne рдХреЙрд▓ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рддреБрд░рдВрдд рдкрд╛рд╕ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

AutoResetEvent рд╡рд░реНрдЧ ManualResetEvent рд╡рд░реНрдЧ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдареАрдХ рдереНрд░реЗрдб рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдХреЙрдХрдб рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХрдИ рдереНрд░реЗрдбреНрд╕ AutoResetEvent рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╕реЗрдЯ рдХреЙрд▓ рдореИрдиреНрдпреБрдЕрд▓ResetEvent рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЗрд╡рд▓ рдПрдХ рдордирдорд╛рдирд╛ рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред ManualResetEvent рд╕рднреА рдереНрд░реЗрдб рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ рдХрд┐ AutoResetEvent рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 AutoResetEvent evt = new AutoResetEvent(false); Thread t1 = new Thread(T1); t1.Start(); Thread.Sleep(100); Thread t2 = new Thread(T2); t2.Start(); 


рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдИрд╡реЗрдВрдЯ рдХреЗрд╡рд▓ рдПрдХ рд▓рдЯрдХреА рд╣реБрдИ рд╕реНрдерд┐рддрд┐ (рдиреЙрди-рд╕рд┐рдЧреНрдирд▓реЗрдб) рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╡реЗрдЯреНрд░реЗрд╕ рдХреЙрд▓ рдкрд░ рд▓рдЯрдХреЗ рд╣реБрдП рдзрд╛рдЧреЗ рдХреЛ рдЬрд╛рдиреЗ рджреЗрддрд╛ рд╣реИред

ReaderWriterLock рдХреЗ рд╡рд┐рдкрд░реАрдд, ManualResetEvent рд╡рд░реНрдЧ рдХреЛ рдЗрд╕рдХреЗ рд╕реНрд▓рд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрджрд╛рд╡рдирдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рди рд╣реА рдЕрдиреБрд╢рдВрд╕рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рдХрд╛ рдкрддрд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЫреЛрдЯреА рдЙрдореНрдореАрджреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╕реНрдкрд┐рди-рд╡реЗрдЯ рдореЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдирд┐рдпрдорд┐рдд рд╕рдВрд╕реНрдХрд░рдг рд▓рдВрдмреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред

ManualResetEvent рдФрд░ AutoResetEvent рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, CountdownEvent рд╡рд░реНрдЧ рднреА рдореМрдЬреВрдж рд╣реИред рдпрд╣ рд╡рд░реНрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬрд╣рд╛рдВ рдЬрд┐рд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рд╛рде рд▓рд╛рдиреЗ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдХрд╛рдВрдЯреЗ-рдЬреБрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд▓реЗрдЦ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣рд╛рдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


  • рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреЛ рдЧрд▓рдд рдпрд╛ рд▓рд╛рдкрддрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреА рд╣реИрдВ, рд╡реЗ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЧрддрд┐рд░реЛрдз рд╣реИрдВ
  • рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЕрдзрд┐рдХ рд╕рдордп рдпрд╛ рд╕рдВрд╕рд╛рдзрди рдЦрд░реНрдЪ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирддреА рд╣реИрдВ - рдереНрд░реЗрдб рднреБрдЦрдорд░реА рдФрд░ рд╡реНрдпрд╕реНрдд рдкреНрд░рддреАрдХреНрд╖рд╛
  • .NET рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рд╕рдореГрджреНрдз рд╣реИ
  • 2 рд▓реЙрдХ рд╡реЗрдЯрд┐рдВрдЧ рдореЛрдб рд╣реИрдВ - рд╕реНрдкрд┐рди рдкреНрд░рддреАрдХреНрд╖рд╛, рдХреЛрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ред рдХреБрдЫ .NET рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд░рд╛рдЗрдореЗрдЯрд┐рд╡ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
  • рдЗрдВрдЯрд░рд▓реЙрдХреНрдб рдкрд░рдорд╛рдгреБ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЙрдХ-рдлреНрд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЖрджрд┐рдо рд╣реИ
  • рд▓реЙрдХ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдореЙрдирд┐рдЯрд░.рдЗрдВрдЯрд░ / рдПрдХреНрдЬрд╝рд┐рдЯ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рдПрдХ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
  • рдирд┐рд░реНрдорд╛рддрд╛-рдЙрдкрднреЛрдХреНрддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Monitor.Pulse / Wait рдореЗрдердб рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ
  • ReaderWriterLockSlim рдЙрди рд▓рд┐рдкрд┐рдпреЛрдВ рдореЗрдВ рдирд┐рдпрдорд┐рдд рд▓реЙрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд╣рд╛рдВ рд╕рдорд╛рдирд╛рдВрддрд░ рд░реАрдбрд┐рдВрдЧ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ
  • рдереНрд░реЗрдб рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП ResetEvent рд╡рд░реНрдЧ рдкрд░рд┐рд╡рд╛рд░ рдХрд╛рдо рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi459514/


All Articles