рд╕рд░рд▓ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкрд░рдорд╛рдгреБ рдЪрд░

рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рд╕реИрдВрдбрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ, рдореВрд▓ рд▓реЗрдЦ (23 рджрд┐рд╕рдВрдмрд░, 2008)

рдкрд░рд┐рдЪрдп


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

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

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

рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рдореЗрдВ, рдкрд░рдорд╛рдгреБ рдЪрд░ рджреЛ рдпрд╛ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЗрдВрдЯреЗрд▓ x86 рдФрд░ x86_64 рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ (рдЬреИрд╕реЗ рдЕрдиреНрдп рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╡рд┐рд╢рд╛рд▓ рдмрд╣реБрдордд) рдХреЗ рдкрд╛рд╕ рдХрд┐рд╕реА рднреА рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдПрдлрдПрд╕рдмреА рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ рд╣реИрдВред FSB рдХрд╛ рдЕрд░реНрде рд╣реИ рдлреНрд░рдВрдЯ рд╕рд╛рдЗрдб рдмрд╕ред рдпрд╣ рдмрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд░реИрдо рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЕрд░реНрдерд╛рддреН, FSB рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ (рдХреЛрд░) рдФрд░ рдЗрд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд░реИрдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХреЗрдЧрд╛ред рдФрд░ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкрд░рдорд╛рдгреБ рдЪрд░ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХрд┐рд╕реА рдиреЗ рдЙрдиреНрд╣реЗрдВ рдорд╛рдирд╡ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЛрдб рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред рдЬреАрд╕реАрд╕реА рд╕реЗ рдкрд╣рд▓реЗ 4.1.2ред

рдкрд░рдорд╛рдгреБ рдЪрд░ рдЖрдХрд╛рд░ рд╕реАрдорд╛


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

рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдкреВрд░реНрдгрд╛рдВрдХ 1, 2, 4 рдФрд░ 8 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рдЖрдк FSB рдХреЛ рдмреНрд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреАрд╕реАрд╕реА рдкрд░рдорд╛рдгреБ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рд▓рдЧрднрдЧ рдкрд╛рд░рджрд░реНрд╢реА, рд▓рдВрдмреЗ, рдФрд░ рд▓рдВрдмреЗ рд▓рдВрдмреЗ (рдФрд░ рдЙрдирдХреЗ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдордХрдХреНрд╖реЛрдВ) рдХреЗ рд╕рд╛рде рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рдХрд▓реНрдк


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

decrement_atomic_value(); if (atomic_value() == 0) fire_a_gun(); 

рдПрдХ рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ 1. рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рджреЛ рдзрд╛рдЧреЗ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЫрджреНрдо рд╕реА рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ?

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



рдЬрдм рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдлрд╛рдпрд░_a_gun () рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдкрдВрдХреНрддрд┐ 3) рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдПрдХ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рдФрд░ рдЕрдЧрд░ рд╣рдо рдореНрдпреВрдЯреЗрдХреНрд╕ рдпрд╛ рд╕реНрдкрд┐рди рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЗ рдЗрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рддреЗ, рддреЛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ред

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

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ ...


рдХреБрдЫ рд╕рд░рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдпрд╣ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдмрд╛рд░рд╣ (рд╣рд╛рдБ, рдмрд╛рд░рд╣ - 12) рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдкрд░рдорд╛рдгреБ рдкрд░рд┐рд╡рд░реНрдзрди, рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рдкрд░рдорд╛рдгреБ рдпрд╛, рдФрд░, рдПрдХреНрд╕реЛрд░ рдФрд░ рдирдВрдж рдмрдирд╛рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╛рд░реНрдп рд╣реИрдВред рдПрдХ рдЬреЛ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЪрд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдпрд╣рд╛рдБ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдп рд╣реИрдВ:
 type __sync_fetch_and_add (type *ptr, type value); type __sync_fetch_and_sub (type *ptr, type value); type __sync_fetch_and_or (type *ptr, type value); type __sync_fetch_and_and (type *ptr, type value); type __sync_fetch_and_xor (type *ptr, type value); type __sync_fetch_and_nand (type *ptr, type value); 

рдпреЗ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ рдЬреЛ рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рджреВрд╕рд░реА рдУрд░, рдирд┐рдореНрди рдХрд╛рд░реНрдп, рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рдЪрд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред
 type __sync_add_and_fetch (type *ptr, type value); type __sync_sub_and_fetch (type *ptr, type value); type __sync_or_and_fetch (type *ptr, type value); type __sync_and_and_fetch (type *ptr, type value); type __sync_xor_and_fetch (type *ptr, type value); type __sync_nand_and_fetch (type *ptr, type value); 

рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рдореНрди рдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
 int unsigned int long unsigned long long long unsigned long long 

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

рдпрд╣ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рджреЗрдЦрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ


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

рд╕реНрд░реЛрдд рдХреЛрдб
 #include <stdio.h> #include <pthread.h> #include <unistd.h> #include <stdlib.h> #include <sched.h> #include <linux/unistd.h> #include <sys/syscall.h> #include <errno.h> #define INC_TO 1000000 //  ... int global_int = 0; pid_t gettid( void ) { return syscall( __NR_gettid ); } void *thread_routine( void *arg ) { int i; int proc_num = (int)(long)arg; cpu_set_t set; CPU_ZERO( &set ); CPU_SET( proc_num, &set ); if (sched_setaffinity( gettid(), sizeof( cpu_set_t ), &set )) { perror( "sched_setaffinity" ); return NULL; } for (i = 0; i < INC_TO; i++) { // global_int++; __sync_fetch_and_add( &global_int, 1 ); } return NULL; } int main() { int procs = 0; int i; pthread_t *thrs; //    procs = (int)sysconf( _SC_NPROCESSORS_ONLN ); if (procs < 0) { perror( "sysconf" ); return -1; } thrs = malloc( sizeof( pthread_t ) * procs ); if (thrs == NULL) { perror( "malloc" ); return -1; } printf( "Starting %d threads...\n", procs ); for (i = 0; i < procs; i++) { if (pthread_create( &thrs[i], NULL, thread_routine, (void *)(long)i )) { perror( "pthread_create" ); procs = i; break; } } for (i = 0; i < procs; i++) pthread_join( thrs[i], NULL ); free( thrs ); printf( "  ,  global_int value : %d\n", global_int ); printf( "  : %d\n", INC_TO * procs ); return 0; } 


36 рдФрд░ 37 рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдХреЗрд╡рд▓ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ __ Sync_fetch_and_add () ред рдЗрд╕ рдХреЛрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ - рдЕрд░реНрдерд╛рдд, Global_int рдХрд╛ рдореВрд▓реНрдп 4,000,000 рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ (рдорд╢реАрди рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдорд┐рд▓рд┐рдпрди рд╕реЗ рдЧреБрдгрд╛ рдХреА рдЬрд╛рддреА рд╣реИ - рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХреНрд╡рд╛рдб-рдХреЛрд░ рдорд╢реАрди рд╣реИ)ред рдпрд╛рдж рд░рдЦреЗрдВ, рдЬрдм рдореИрдВрдиреЗ рдХреЛрдб рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдЪрд▓рд╛рдпрд╛ рдерд╛, рддреЛ рд▓рд╛рдЗрди 36 рдХреЛ рдЫреЛрдбрд╝рдХрд░ , рдкрд░рд┐рдгрд╛рдо 1,908,090 рдерд╛, рди рдХрд┐ 4,000,000, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдореЗрдВ рдЙрдореНрдореАрдж рдереАред

рд╕рд╛рд╡рдзрд╛рдирд┐рдпреЛрдВ


рдкрд░рдорд╛рдгреБ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд╛рд╡рдзрд╛рдиреА рдмрд░рддрдиреА рдЪрд╛рд╣рд┐рдПред рдЬреАрд╕реАрд╕реА рдореЗрдВ рдПрдХ рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рд╕рд╛рдзрд╛рд░рдг рдЪрд░ рдкрд░ рдкрд░рдорд╛рдгреБ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдкрд░рдорд╛рдгреБ рдЪрд░ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдХреБрдЫ рднреА рдЖрдкрдХреЛ __ Sync_fetch_and_add () рдХреЗ рд╕рд╛рде рдкрд░рдорд╛рдгреБ рдЪрд░ рдХреЗ рдорд╛рди рдХреЛ рдмрдврд╝рд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп ++ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИред
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдПрдХ рдЧрдВрднреАрд░ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЪреАрдЬреЗрдВ, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рднреВрд▓ рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рдпрд╣ рдХреЗрд╡рд▓ рд╕рдордп рдХреА рдмрд╛рдд рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдЬреАрд╕реАрд╕реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкрд░рдорд╛рдгреБ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЪрд░ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓рдирд╛ рд╢реБрд░реВ рди рдХрд░реЗрдВред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдбреАрдЯреА (рд╕рд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ - рд▓рдЧрднрдЧред рдкреНрд░рддрд┐) рд╕реА рдореЗрдВ рдпрд╛ рд╕реА ++ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рдорд╛рдгреБ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдЪрд░ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЬреЛрд░рджрд╛рд░ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

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


рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЗрдЦреЛрдВ рдФрд░ рдкреЛрд╕реНрдЯреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдирд╡реАрдирддрдо рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЕрдиреБрд╕рдВрдзрд╛рди рдФрд░ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВред рдЖрд╢рд╛ рд╣реИ рдЖрдкрдХреЛ рдпреЗ рдкреЛрд╕реНрдЯ рдФрд░ рдкреЛрд╕реНрдЯ рдорджрджрдЧрд╛рд░ рд▓рдЧреА рд╣реЛрдВрдЧреАред рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдИ-рдореЗрд▓ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВ (рдореВрд▓ - рдЕрдиреБрдорд╛рдирд┐рддред рдкреНрд░рддрд┐ред)ред

рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ

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

рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╕рдордп рдкрд░рдорд╛рдгреБ рдЪрд░:

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


All Articles