рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╣рдордиреЗ рдЬрд┐рд╕ рдкрд░рдорд╛рдгреБ рдЧреБрдгрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛
рдерд╛, рд╡рд╣ рдПрдХ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдореЙрдбрд▓ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЬрд┐рд╕реЗ рд░реЗрдордВрдб рдиреЗ "рдбреВ, рд░рд╛рдЗрдЯ, (рдкреБрди: рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)" рдХрд╣рд╛ред
рдХреЗ рд▓рд┐рдП (;)) {
// рд╕рд╛рдЭрд╛ рдЪрд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд▓реЗрдВ,
// рдЬрд┐рд╕реЗ рд╣рдо рдмрджрд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ
oldValue = shareVariable;
... рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд▓реЗрдВ ...
newValue = ... рдирдП рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдХрд░реЗрдВ
oldValue рдФрд░ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ ...
// рдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдПрдХреНрд╡рд╛рдпрд░, рд░рд┐рд▓реАрдЬ, рдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
рдЕрдЧрд░ (InterlockedCompareExchangeXxx (
& рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп,
newValue, oldValue) == oldValue) {
рддреЛрдбрд╝; // рд░рд┐рдХреЙрд░реНрдб рд╡рд┐рдлрд▓
}
... NewValue рдирд┐рдХрд╛рд▓реЗрдВ ...
} // рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
рд╣рдо рдирдП рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рд╕рд╛рдЭрд╛ рдЪрд░ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ
InterlockedCompareExchange
рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ
рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рдЕрдЧрд░ рдпрд╣ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рдФрд░ рдзрд╛рд░рд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ; рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╢реБрд░реВ рд╕реЗ рд╣реА рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдХреЛрдИ рд╣рдореЗрдВ "рдХрд╛рдЯ" рдирд╣реАрдВ рд╕рдХрддрд╛ред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ "рдХрд░реЛ, рд▓рд┐рдЦреЛ, рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЛ" рдореЙрдбрд▓ рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЬреЛ рдзрд╛рдЧрд╛ рдкрд╣рд▓реЗ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ "рджреМрдбрд╝" рдкрд╣рд▓реЗ рдЬреАрдд рдЬрд╛рдПрдЧрд╛ред "рдЕрд╕рдлрд▓" рдзрд╛рд░рд╛, рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рддреЗрдЬ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡рд┐рдпреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдФрд░ рдлрд┐рд░ рд╕реЗ рдЬреАрдд рд╕рдХрддреА рд╣реИ; рдпрд╣ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╡рд╣
рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рд╢реБрд░реВ рдХрд┐рдП рдЧрдП рдСрдкрд░реЗрд╢рди
рдХреЛ рдХрднреА рдкреВрд░рд╛ рдирд╣реАрдВ
рдХрд░реЗрдЧрд╛ (рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рд░рд╛ рдЬреЛ рдЙрд╕рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЬрд╛рддреА рд╣реИ рд╡рд╣ рдЕрдкрдиреЗ рдЖрдк рдкреВрд░реА рд╣реЛ рдЬрд╛рдПрдЧреА)ред рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд▓реЙрдХрд▓реЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ - рддрд╛рд▓реЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЬреЛ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрддрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ: рдкрд╣рд▓рд╛ рдирдВрдмрд░ рдЖрддрд╛ рд╣реИ - рдкрд╣рд▓рд╛ рдореЛрдмрд╛рдЗрд▓ рдкрд╛рд╕ред
рдЕрдиреБрд╡рд╛рджрдХ рдиреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХрд╛ рд╕рд╛рд╣рд╕ рдХрд┐рдпрд╛: рдореИрдХрдбреЙрдирд▓реНрдбреНрд╕ рдХрд╛ рдмреЙрдХреНрд╕ рдСрдлрд┐рд╕ рдПрдХ рдорд╣рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреАрдЫреЗ рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рд╣реИред рдЕрдЧрд░ рдЪреЗрдХрдЖрдЙрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдЧреНрд░рд╛рд╣рдХ рдЫреЛрдЯреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЬреЗрдм рд╕реЗ рд░рдЧрдбрд╝ рд░рд╣рд╛ рд╣реИ, рддреЛ рдмрд╛рдХреА рдЧреНрд░рд╛рд╣рдХ рдФрд░ рдХреИрд╢рд┐рдпрд░ рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рд╣реИрдВ; рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдгрд╛рд▓реА рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реИред рджреВрд╕рд░реА рдУрд░, рд░реЗрд╕реНрддрд░рд╛рдВ рдореЗрдВ рд╡реЗрдЯрд░ рдПрдХ рдорд╣рд▓ рд░рд╣рд┐рдд рд╕рдВрд╕рд╛рдзрди рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдЙрд╕реЗ рджреЛрдкрд╣рд░ рдХреЗ рднреЛрдЬрди рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдЧреНрд░рд╛рд╣рдХ "рд╣рд┐рд▓рд╛" рдФрд░ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╡реЗрдЯрд░ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗрдЯрд░ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рд╡рд┐рдЪрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рд╡рд╣ рдЕрдВрддрддрдГ рдЖрдкрдХреА рдореЗрдЬ рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддрд╛; рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл, рдЕрдЧрд░ рд╡рд╣ рдЖрдкрдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдм рд╡рд╣ рдХрд┐рд╕реА рдФрд░ рдХреА рд╕реЗрд╡рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдирд┐рд╖реНрдХреНрд░рд┐рдп рдирд╣реАрдВ рд╣реИред
рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рд╕реЗ
InterlockedMultiply
рдлрд╝рдВрдХреНрд╢рди рдпрд╣рд╛рдВ рджрд┐рдП рдЧрдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рд▓рдЧрднрдЧ рдХреНрд░рд┐рдпрд╛: "рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░" рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░реЗрд╖рд┐рдд рдЧреБрдгрдХ рд╣реИ; "рдирдпрд╛ рдЕрд░реНрде" рдПрдХ рдХрд╛рдо рд╣реИред рдпрджрд┐ рдирдП рдореВрд▓реНрдп рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рд╡рд┐рдлрд▓ рд╣реЛ рдЧрдИ, рддреЛ рдХрд┐рд╕реА рдФрд░ рдиреЗ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛, рдФрд░ рд╣рдо рдлрд┐рд░ рд╕реЗ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдВрддрд┐рдо рдкреЛрд╕реНрдЯ рдореЗрдВ рд╕реНрдереИрддрд┐рдХ рдЪрд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрдн рднреА "рдбреВ, рд░рд╛рдЗрдЯ, (рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)" рдореЙрдбрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдмрд╕ "рдлрд┐рд░ рд╕реЗ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ" рдЪрд░рдг рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╡рд╣реА рдорд╛рди рд╣реЛрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдУрд╡рд░рдЯреЗрдХрд┐рдВрдЧ рд╕реНрдЯреНрд░реАрдо рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдЭрд╛ рдЪрд░ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдереЗ; рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЪрд░рдг рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реИрд░рд┐рдПрдмрд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
InterlockedCompareExchange
рдЙрдкрдпреЛрдЧ рд░рд┐рд▓реАрдЬрд╝ рд╡реЗрд░рд┐рдПрдВрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирдпрд╛ рдорд╛рди рдХреЗрд╡рд▓ рдореЗрдореЛрд░реА рдореЗрдВ рдЕрдиреНрдп рдбреЗрдЯрд╛ (рдХреЗрд╡рд▓ рдПрдХ рд╕рд╛рде) рдХреЗ рд╕рд╛рде рд╣реА рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдмрд╛рдж рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдореЙрдбрд▓ рдХрд╛ рдПрдХ рдФрд░ "рдЕрдиреБрдХреВрд▓рд┐рдд" рд╕рдВрд╕реНрдХрд░рдг "рдХрд░реЛ, рд▓рд┐рдЦреЛ, (рдирд┐рд░рд╛рд╢рд╛)" рд╣реИред рдЗрд╕рдореЗрдВ рдХреЛрдИ рд▓реВрдк рднреА рдирд╣реАрдВ рд╣реИ: рдпрджрд┐ рдХреЛрдИ рдирдпрд╛ рдорд╛рди рд▓рд┐рдЦрдирд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╡рд┐рдлрд▓рддрд╛ рдХреЛ рдШрд╛рддрдХ рдорд╛рдирддрд╛ рд╣реИ, рдФрд░ рдЖрдЧреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдкреБрдирд░реНрд╡рд┐рддреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
TryEnterCriticalSection
ред рдпрд╣
InterlockedCompareExchangeAcquire
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ: рдХрд┐рд╕реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЗ рдЕрдВрджрд░ рд╕реЗ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдпрд╣ рд░рд┐рдХреЙрд░реНрдб рд╣реЛ рдХрд┐ рдЕрдиреБрднрд╛рдЧ рд╡реНрдпрд╕реНрдд рд╣реИред
рдпрджрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЪрд░ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдгрд┐рдд "рдПрдмреАрдП рд╕рдорд╕реНрдпрд╛" рддрдм рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рд╣реА рд╕реВрдЪрдХ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕реНрдереИрддрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ: рд╕реВрдЪрдХ рдХреЗрд╡рд▓ NULL рд╕реЗ
рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рд╕рдХрддрд╛
рд╣реИ , рдФрд░ рдПрдХ рдмрд╛рд░ рдЧреИрд░-NULL рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╕реВрдЪрдХ рдЕрдм рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рд╕реВрдЪрдХ рдХреЛ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЗрд╕ рд╕реВрдЪрдХ рдФрд░ "рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛" рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реВрдЪрдХ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдмрдврд╝рддрд╛ рд╣реИред
"рдбреВ, рд░рд╛рдЗрдЯ, (рдлрд┐рд░ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ)" рдореЙрдбрд▓ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рджреЛ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп:
рд▓рдВрдмреА рдЗрдВрдЯрд░рд▓рд╛рдХреЗрдбрд░реЗрдХреНрд╡рд╛рдпрд░ (LONG * pl рдореЗрдВ __, LONG LUnliks)
{
рд╡рд╛рдкрд╕реА InterlockedCompareExchangeAcquire (pl, lUnlikely, lUnlikely);
}
рд▓рдВрдмреА рдЗрдВрдЯрд░рд▓рд╛рдХреЗрдб рд░рд┐рдЬрд▓реНрдЯ (__ рдореЗрдВ рд▓рдВрдмреА * pl, __ рд▓рдВрдмрд╛рдИ рд▓рдВрдмреА рджреВрд░реА)
{
InterlockedCompareExchangeRelease (pl, lUnlikely, lUnlikely);
}
LONG рдЪрд░ рдХреЛ рд╕реАрдзреЗ рдкрдврд╝рдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпреЗ рдХрд╛рд░реНрдп рдЙрд╕ рдЖрджреЗрд╢ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐
InterlockedCompareExchange
рдСрдкрд░реЗрд╢рди рдореЗрдВ рддреБрд▓рдирд╛ рдФрд░ рдирдП рдорд╛рди рд╕рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЪреЗрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдорд╛рди рдСрдкрд░реЗрд╢рди рдХреЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреЛрдб рдХреЗ рд╕рдорд╛рди рд╣реИрдВ:
if (* pl == lUnlikely) * pl = lUnlikely;
рдЬреИрд╕рд╛ рдХрд┐
lUnlikely
рд░реВрдк рд╕реЗ
lUnlikely
рд░реЗрдордВрдб рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдореВрд▓реНрдп рдЪреБрдирдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рди рд╣реЛ рдФрд░ рдХреИрд╢ рдмреНрд▓реЙрдХ рдЧрдВрджрд╛ рди рд╣реЛред (рд╕рднреА рдкреНрд░реЛрд╕реЗрд╕рд░реЛрдВ рдкрд░ рдирд╣реАрдВ, рдпрд╣ рдЖрдкрдХреЛ рдореЗрдореЛрд░реА рд▓рд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреА рдЯреНрд░рд┐рдХ рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧреАред)
рддреЛ рд╣рдорд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг:
рд▓рдВрдмреА g_lColorChange; // рд░рдВрдЧ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛
...
WM_SYSCOLORCHANGE рдХреЗрд╕:
рдЗрдВрдЯрд░рд▓реЙрдХреНрдб рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ (& g_lColorChange);
...
int CalculateSomethingAboutSystemColors ()
{
рд▓рдВрдмреА lColorChangeStart;
рдХрд░реЛ {
lColorChangeStart = InterlockedReadAcquire (& g_lColorChange, -1);
COLORREF clrWindow = GetSysColor (COLOR_WINDOW);
COLORREF clrHighlight = GetSysColor (COLOR_HIGHLIGHT);
... GetSysColor (...) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЕрдиреНрдп рдЧрдгрдирд╛
} рдЬрдмрдХрд┐ (InterlockedReadRelease (
& g_lColorChange, -1)! = lColorChangeStart);
рд╡рд╛рдкрд╕реА iResult;
}
рд╣рдо рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреА рдЧрдгрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдПрдХреНрд╡рд╛рдпрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд░реАрдб рд╡рд░реНрдЬрди рдирдВрдмрд░ рдХреЛ рдЙрди рдХрд▓рд░ рд╡реИрд▓реНрдпреВ рд╕реЗ рдкрд╣рд▓реЗ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рд╣рдо рдХреИрд▓рдХреБрд▓реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред
рдЬрдм рдЧрдгрдирд╛ рдкреВрд░реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдо рд╕рд╣реЗрдЬреЗ рдЧрдП рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реА рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рд░рдВрдЧ рдмрджрд▓ рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдпрджрд┐ рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди рд░рдВрдЧ рдЪрд╛рд░ рдмрд┐рд▓рд┐рдпрди рдмрд╛рд░ рдмрджрд▓ рдЧрдП рд╣реИрдВ рддреЛ рдПрдХ ABA рд╕рдорд╕реНрдпрд╛ рд╕рдВрднрд╡ рд╣реИ: рдХрд╛рдЙрдВрдЯрд░ рдУрд╡рд░рдлреНрд▓реЛ рдХреЗ рдХрд╛рд░рдг рд╣рдордиреЗ рдЗрд╕реЗ рдиреЛрдЯрд┐рд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИред