рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди

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

рджреЛ рдереНрд░реЗрдб 20,000,000 рдмрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореНрдпреВрдЯреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореВрд▓реНрдп рдореЗрдВ рдПрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ - рдФрд░ рд╣рд░ рдмрд╛рд░ рдЖрдЙрдЯрдкреБрдЯ рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ 20,000,000 рд╕реЗ рдХрдо рд╣реИ!



рдЬреИрд╕рд╛ рдХрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рдорд╛рд░рд╛ рджреБрд╢реНрдорди рд╕реАрдкреАрдпреВ рд╣реИ ред

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

рдбреЗрдореЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдХреЛрдб , рдЬрд┐рд╕рдореЗрдВ рджреЛрдиреЛрдВ рдзрд╛рд░рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ sharedValue рдХреЛ sharedValue рдХреЗ рд╕рд╛рдЭрд╛ рдореВрд▓реНрдп рдореЗрдВ sharedValue , рдореНрдпреВрдЯреЗрдХреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИред

рдпрд╣рд╛рдВ рдПрдХ рдореЗрд╢рд┐рдлреНрдЯ рдореНрдпреВрдЯреЗрдХреНрд╕ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ: рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реАрдордлреЛрд░ рдЬреЛ 1 рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╡реНрдпрд╕реНрдд рд╣реИ, рдпрд╛ 0 рдпрджрд┐ рдпрд╣ рдореБрдлрд╝реНрдд рд╣реИред

 int expected = 0; if (flag.compare_exchange_strong(expected, 1, memory_order_acquire)) { // The lock succeeded } 

рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ memory_order_acquire рдФрд░ memory_order_release рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдмреЗрдорд╛рдиреА рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЖрд╡рд╢реНрдпрдХ рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рдХреБрдЫ рд╕реВрддреНрд░ рдПрдХ рд╕рдордиреНрд╡рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдорд╛рдлреЛрд░ рдорд╛рди рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддреЗ рд╣реИрдВред

 flag.store(0, memory_order_release); 

рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЬреЗрдлрд╝ рдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ memory_order_acquire рдФрд░ memory_order_release рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:

 void IncrementSharedValue10000000Times(RandomDelay& randomDelay) { int count = 0; while (count < 10000000) { randomDelay.doBusyWork(); int expected = 0; if (flag.compare_exchange_strong(expected, 1, memory_order_relaxed)) { // Lock was successful sharedValue++; flag.store(0, memory_order_relaxed); count++; } } } 

рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ Xcode рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред



IPhone рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╣реА рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред



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



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

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

 void IncrementSharedValue10000000Times(RandomDelay& randomDelay) { int count = 0; while (count < 10000000) { randomDelay.doBusyWork(); int expected = 0; if (flag.compare_exchange_strong(expected, 1, memory_order_acquire)) { // Lock was successful sharedValue++; flag.store(0, memory_order_release); count++; } } } 

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрдХрд▓рдХ dmb ish рдирд┐рд░реНрджреЗрд╢ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ ARMv7 рдореЗрдВ рдореЗрдореЛрд░реА рдмреИрд░рд┐рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдФрд░ рдлрд┐рд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдкрдирд╛ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдордЬрд╝рдмреВрддреА рд╕реЗ sharedValue рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдп рдХреА рд░рдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реИред



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

"рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЫреЛрдЯреА рдЧрд╛рдбрд╝реА" рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдореЗрдВ, рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ 1 рд╕реЗ 1000 рд╣реИ, рдФрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдпрд╣ 1 рд╕реЗ 1.000.000 рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рддреН, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЧреНрд▓рд┐рдЪ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдкрдХрдбрд╝рдирд╛ рдмреЗрд╣рдж рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ 999.999 рдмрд╛рд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЕрдЧрд▓реА рдмрд╛рд░ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

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


All Articles