рдЗрд╖реНрдЯрддрдо рддреБрд▓реНрдпрдХрд╛рд▓рди рддрдВрддреНрд░ рдХреА рдЦреЛрдЬ рдореЗрдВ, рдореИрдВ рдЕрдХреНрд╕рд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдмрдирд╛рдо ... рдЬреИрд╕реЗ рдкрджреЛрдВ рдкрд░ рдЖ рдЧрдпрд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЗрди рддрдВрддреНрд░реЛрдВ рдХреЗ рдирдХреНрд╢реЗ рдореЗрдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯрддрд╛ рдирд╣реАрдВ рдорд┐рд▓реАред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрд╡рд░реБрджреНрдз рддрдВрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЫреЛрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╢рд╛рдпрдж рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЕрд╡рд░реБрджреНрдз рддрдВрддреНрд░ рдХреА рд╡рд┐рд▓рдВрдмрддрд╛ рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдзрд╛рдЧреЗ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрд╕рд╛рдзрди -
volatile unsigned long int incremented;
BIG_NUMBER рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ "рдЙрдкрдпреЛрдЧреА" рдХрд╛рдо рд╣реИред
рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рд▓рд╛рдЧрдд рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд┐рднрд┐рдиреНрди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рддрдВрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕рдордп рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЧреНрд░рд╛рдл рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╣реИред
рдмреНрд░реЗрдбреНрд╕ рдСрдл рдереНрд░реЗрдбреНрд╕ (1..N рдЯреБрдХрдбрд╝реЗ) рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд╣реЛрддреЗ рд╣реИрдВред
рдкрд░реАрдХреНрд╖рдг рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЧреЗред
PINC (рд╕рдорд╛рдирд╛рдВрддрд░ рдЗрдВрдХреНрд░реАрдореЗрдВрдЯрд░)ред
рд╕реНрд░реЛрдд рдФрд░ рдкрд░рд┐рдгрд╛рдо
рдЬреАрдердм рдкрд░ рд╣реИрдВред рдЖрдк рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдХреЗ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдпрд╣рд╛рдВ рдирд╣реАрдВ рд▓рд╛рддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднрд╛рд░реА рд╣реИред рдореИрдВ рдЦреБрдж рдХреЛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг рддрдХ рд╕реАрдорд┐рдд рдХрд░реВрдВрдЧрд╛ред
рддреЛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╡реГрджреНрдзрд┐ рд╣реИред рд╡рд╛рд╖реНрдкрд╢реАрд▓ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЬрдм -O3 рдХрд╛ рд╕рдВрдХрд▓рди рдХрд┐рдпрд╛ рдЬрд╛рдП рддреЛ рдЪрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рди рдЖрдПред
рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
for(long i = 0;i < BIG_NUMBER; i++) incremented++;
рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, BIG_NUMBER рдХреЛ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдереНрд░реЗрдбреНрд╕ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрдереНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдлреИрдХреНрдЯрд░рд┐рдпрд▓ рдПрди! = 1 * 2 * ... * рдПрдо * ... * (рдПрди -1) * рдПрдиред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдо рдереНрд░реЗрдб рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдорд┐рд▓реЗрдЧреАред
рд╕рдХреНрд░рд┐рдп рдкрд░реАрдХреНрд╖рдг рдмреНрд▓реЙрдХ (рдмреНрд░реИрдХреЗрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреАрд╡рд░реНрдб рд╣реИрдВ):
- рд╢реБрджреНрдз рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИ (рдХреНрд░рдорд┐рдХ рд╡реГрджреНрдзрд┐):
incremented++;
- рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ (рд▓реЙрдХ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдкрд░реАрдХреНрд╖рдг)
__sync_fetch_and_add(&incremented,1)
рдпрд╣рд╛рдБ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдлрдВрдХреНрд╢рди тАЬрд▓реЙрдХ xaddl ..тАЭ рдХреА рддрд░рд╣ рд╣реИред
- рдХреИрд╕ рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди (рд▓реЙрдХ рддреБрд▓рдирд╛ рдФрд░ рд╕реНрд╡реИрдк рдЯреЗрд╕реНрдЯ)
do{ x = incremented; }while(!__sync_bool_compare_and_swap(&incremented,x , x + 1));
рдФрд░ рдпрд╣ рдПрдХ "рд▓реЙрдХ cmpxchgl .." рд╣реИред
- рдкрд╛рд▓рдХ рдкрд░реАрдХреНрд╖рдг
pthread_spin_lock(&spin)
- рдореНрдпреВрдЯреЗрдб рдкрд░реАрдХреНрд╖рдг
pthread_mutex_lock(&mut)
рдкрд░реАрдХреНрд╖рдг рд╕рдВрд░рдЪрдирд╛
рдкреНрд░рддреНрдпреЗрдХ рд╕рдХреНрд░рд┐рдп рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП, рддреАрди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред Init, thread, fini - рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИред рдереНрд░реЗрдб рдмрдВрдбрд▓ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрдирд┐рдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рди - рдХреЗ рдмрд╛рджред рдзрд╛рдЧрд╛ - рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧреЗ рдореЗрдВ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХрд╛ рдЕрдкрдирд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИред
рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдПрдХ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░рдирд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛, "рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛" рдХрд╛ рдорд╛рди, рдЙрдирдХрд╛ рдЕрдкрдирд╛ рдереНрд░реЗрдб рдирдВрдмрд░ рд╣реЛрддрд╛ рд╣реИред рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдзрд╛рдЧрд╛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдереНрд░реЗрдб рдирдВрдмрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
= _ % _
рдереНрд░реЗрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдмрд╛рдВрдзрдирд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдереНрд░реЗрдб рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдХреЛрд░ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмрдВрдзрди pthread_setaffinity_np рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рдзрд╛рдЧрд╛ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХрд╛ рдЕрдкрдирд╛ рд╣рд┐рд╕реНрд╕рд╛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╕рдордп рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЕрдЧрд▓рд╛ рдЧреБрдЪреНрдЫрд╛ рдпрд╛ рдЕрдЧрд▓рд╛ рдкрд░реАрдХреНрд╖рдг рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо
рдкрд░реАрдХреНрд╖рдг рдирдореВрдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ, рдПрдХ рдбреЗрд╕реНрдХрдЯреЙрдк рдХрдВрдкреНрдпреВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
CPU рдореЙрдбрд▓ рдХрд╛ рдирд╛рдо: Intel┬о Core (TM) 2 рдбреБрдУ CPU E8400 @ 3.00GHz
рдереНрд░реЗрдб рд▓рд┐рдмрд╛рд╕: рдПрдирдкреАрдЯреАрдПрд▓ 2.13
2 рдХреЗ 2 рдХреЛрд░ рдСрдирд▓рд╛рдЗрди
рд╡реНрдпрд╕рди рд╕реВрддреНрд░: 100
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛: 11! = 0x2611500
рдФрд░ рдпрд╣рд╛рдБ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреЛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ (рдЪрд┐рддреНрд░ рд╕рдорд╛рди рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдкреИрдорд╛рдиреЛрдВ рдкрд░ рд╣реИрдВ):
рдпрд╣рд╛рдБ рдкрд░ рд╣рд░ рдмрд┐рдВрджреБ рдХрд╛ рд╕рдордп резрез рд╣реИ! рд╡реЗрддрди рд╡реГрджреНрдзрд┐ред



рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрдВрддреНрд░ рдХреЗ рдлрд╛рдпрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджрд░реНрд╢рди рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдУрд╡рд░рд╣реЗрдб рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХрдореЛрдмреЗрд╢ рдкреВрд░реНрд╡рд╛рдиреБрдореЗрдп рд╣реИред рдХреЗрд╡рд▓ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдПрдХ рд╕реНрдкрд┐рдирд▓реЙрдХ рдХреИрд╕ рд╕реЗ рднреА рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред
рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЛрд░ рдХреЗ рд╕рд╛рде рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореБрдЭреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдбреЗрдЯрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╣рдмреНрдмрд░-рд▓реЛрдЧреЛрдВ рд╕реЗ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд╡реЗ рдЧреАрдердм рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВ рдпрд╛ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред
рд╕реМрднрд╛рдЧреНрдп рд╣реИред
рдкреБрдирд╢реНрдЪред рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (-h рдорджрдж):
make;./pinc -f11 -t50
рдпрд╛рдиреА BIG_NUMBER = 11 рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛! 1 рд╕реЗ (рд╕рдВрдЦреНрдпрд╛_рдиреНрдпреВрдХреНрд▓рд┐рдп + 50) рдереНрд░реЗрдб рдХреЗ рдмрдВрдбрд▓реЛрдВ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рд╡реЗрддрди рд╡реГрджреНрдзрд┐ред
рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдордЧреНрд░реА рдПрдХрддреНрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХрд┐рд╕реА рдХреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реЛрдЧреАред рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж