рд▓реЙрдХрд▓реЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо: рдЕрд╕реНрдерд┐рд░ рдХреИрд╢

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

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

 BOOL IsPrime (int n)
 {
  рд╕реНрдерд┐рд░ int nLast = 1;
  рд╕реНрдерд┐рд░ BOL fLastIsPrime = FALSE;

  // рдпрджрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ,
  // рддреИрдпрд╛рд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
  if (n == nast) рд╡рд╛рдкрд╕реА fLastIsPrime;

  // рдирдП рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ рдФрд░ рдпрд╛рдж рд░рдЦреЗрдВ
  nLast = n;
  fLastIsPrime = slow_IsPrime (n);
  рд╡рд╛рдкрд╕реА fLastIsPrime;
 }

рдмреЗрд╢рдХ, рдпрд╣ рдХреЛрдб рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ: рдпрджрд┐ рдПрдХ рдереНрд░реЗрдб slow_IsPrime() рдХреЙрд▓ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рдереНрд░реЗрдб рдЬрд┐рд╕реЗ IsPrime() рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, nLast рдФрд░ fLastIsPrime рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рдмрдирд╛ рджреЗрдЧрд╛ред

рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдХреЛрдб рдХреЛ рдШреЗрд░рдирд╛ рд╣реИ; рд▓реЗрдХрд┐рди рд╕рд╛рджрдЧреА рдкреНрд░рджрд░реНрд╢рди рдХреА рдХреАрдордд рдкрд░ рд╣реИ: рдЕрдЧрд░, рдХрд╣рддреЗ рд╣реИрдВ, nLast = 5, fLastIsPrime = TRUE, рдФрд░ рджреЛ рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде IsPrime(5) , рддреЛ рдЙрдиреНрд╣реЗрдВ рд▓рд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреБрдЫ рднреА рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреИрд╢реНрдб рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдмрд┐рдирд╛ рд▓реЙрдХ рдХреЗ рд╣рдорд╛рд░реЗ рдХреИрд╢ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдкрд┐рдЫрд▓реА рдкреЛрд╕реНрдЯ рд╕реЗ рдПрдХ рдмрд╛рд░ рдореЗрдВ рджреЛ рдЯреНрд░рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ: рд╣рд░ рдмрд╛рд░ рдбреЗрдЯрд╛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛, рдФрд░ рдХреИрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдбреВ, рд░рд╛рдЗрдЯ, (рдирд┐рд░рд╛рд╢рд╛)" рдореЙрдбрд▓ред

 # рдЕрд▓реНрдкрд╛рдЗрди рдкреГрдердХ (рдПрд▓) ((рдПрд▓) рдФрд░ 1)

 BOOL IsPrime (int n)
 {
  рд╕реНрдерд┐рд░ int nLast = 1;
  рд╕реНрдерд┐рд░ BOL fLastIsPrime = FALSE;
  рд╕реНрдерд┐рд░ рд▓рдВрдмреА lCounter = 0;

  // рдХреИрд╢ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
  LONG lCounterStart = InterlockedReadAcquire (& lCounter, -1);
  рдЕрдЧрд░ (IsLocked (lCounterStart) && n == nLast) {
   BOOL fResult = fLastIsPrime;
   // рдХрд┐рд╕реА рдиреЗ рд╣рдорд╛рд░реЗ рдкреАрдЫреЗ рдХреИрд╢ рдирд╣реАрдВ рдЫреБрдЖ?
   рдпрджрд┐ (InterlockedReadRelease (& lCounter, -1) == lCounterStart)
    рд╡рд╛рдкрд╕реА;
  }

  // рдпрд╛ рддреЛ рдХреИрд╢ рд╕реЗ рдкрдврд╝рдирд╛ рд╡рд┐рдлрд▓ рд░рд╣рд╛, рдпрд╛ рдореВрд▓реНрдп рдлрд┐рдЯ рдирд╣реАрдВ рд╣реБрдЖ:
  // рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд░реЗрдВ
  BOOL fIsPrime = slow_IsPrime (n);

  // рдХреИрд╢ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ
  lCounterStart = lCounter;
  рдЕрдЧрд░ (IsLocked (lCounterStart) &&)
      InterlockedCompareExchangeAcquire (& lCounter,
               lCounterStart + 1, lCounterStart) == lCounterStart) {
   nLast = n;
   fLastIsPrime = fIsPrime;
   InterlockedCompareExchangeRelease (рдФрд░ lCounter,
               lCounterStart + 2, lCounterStart + 1);
  }
  рд╡рд╛рдкрд╕реА fIsPrime;
 }

lCounter рдореЗрдВ lCounter рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреИрд╢ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП "рд▓реЙрдХ" рд╣реИ; рд╢реЗрд╖ рдмрд┐рдЯреНрд╕ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рд╕рдВрдЧрдарди рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдСрдкрд░реЗрд╢рди рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рджреЛ рднрд╛рдЧ рд╣реЛрддреЗ рд╣реИрдВ: рдХреИрд╢ рд╕реЗ рдкрдврд╝рдирд╛ рдФрд░ рдХреИрд╢ рд╕реЗ рд▓рд┐рдЦрдирд╛ред рдЬрдм рдХреИрд╢ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╡рд╛рдпрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде lCounter рдкрдврд╝рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд░реАрдб nLast рдФрд░ fLastIsPrime рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдЧрдП рдереЗред рдпрджрд┐, рдкрдврд╝реА рдЧрдИ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдХреИрд╢ рдХреЛ рдмреНрд▓реЙрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдЕрдВрддрд┐рдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд▓реЗрддреЗ рд╣реИрдВ; рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЬрд┐рд╕ рд╕рдордп рд╣рдо рдХреИрд╢ рд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ рдЙрд╕ рд╕рдордп рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдпрджрд┐ рдпрд╣ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╢рд╛рдпрдж рд╣рдо рдЬреЛ рдореВрд▓реНрдп рдкрдврд╝рддреЗ рд╣реИрдВ рд╡реЗ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП "рдЙрдкрдпреБрдХреНрдд" рдкрд░рд┐рдгрд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред

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

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

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

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

рдПрдХ рд╕рдорд╛рди рдкреНрд░рдгрд╛рд▓реА TryEnterCriticalSection рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:

 BOOL IsPrime (int n)
 {
  рд╕реНрдерд┐рд░ int nLast = 1;
  рд╕реНрдерд┐рд░ BOL fLastIsPrime = FALSE;
  BOOL fHaveAnswer = FALSE;
  BOOL fIsPrime;

  // рдХреИрд╢ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
  рдЕрдЧрд░ (TryEnterCriticalSection (& g_cs)) {
   рдЕрдЧрд░ (n == nLast) {
    fHaveAnswer = TRUE;
    fIsPrime = fLastIsPrime;
   }
   рд▓реАрд╡ рдХреНрд░рд┐рдЯрд┐рд╕рд▓рд╛рдИрдЯ (& g_cs);
  }
  рдЕрдЧрд░ (fHaveAnswer) рд╡рд╛рдкрд╕реА fIsPrime;

  // рдпрд╛ рддреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рд╡реНрдпрд╕реНрдд рд╣реИ, рдпрд╛ рдореВрд▓реНрдп рдлрд┐рдЯ рдирд╣реАрдВ рд╣реИ:
  // рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд░реЗрдВ
  fIsPrime = slow_IsPrime (n);

  // рдХреИрд╢ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ
  рдЕрдЧрд░ (TryEnterCriticalSection (& g_cs)) {
   nLast = n;
   fLastIsPrime = fIsPrime;
   рд▓реАрд╡ рдХреНрд░рд┐рдЯрд┐рд╕рд▓рд╛рдИрдЯ (& g_cs);
  }
  рд╡рд╛рдкрд╕реА fIsPrime;
 }

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

рд╡рд┐рдВрдбреЛрдЬ 7 рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ, рд╣рдо рд╕реНрд▓рд┐рдо рд░реАрдбрд░-рд░рд╛рдЗрдЯрд░ рд▓реЙрдХ рдХреЛ рднреА рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 BOOL IsPrime (int n)
 {
  рд╕реНрдерд┐рд░ int nLast = 1;
  рд╕реНрдерд┐рд░ BOL fLastIsPrime = FALSE;
  BOOL fHaveAnswer = FALSE;
  BOOL fIsPrime;

  // рдХреИрд╢ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
  рдЕрдЧрд░ (TryAcquireSRWLockSared (& g_lock)) {
   рдЕрдЧрд░ (n == nLast) {
    fHaveAnswer = TRUE;
    fIsPrime = fLastIsPrime;
   }
   рд░рд┐рд▓реАрдЬрд╝рд╕реНрд╡рд░рд▓реЙрдХрд╢реЗрдпрд░ (& g_lock);
  }
  рдЕрдЧрд░ (fHaveAnswer) рд╡рд╛рдкрд╕реА fIsPrime;

  // рдпрд╛ рддреЛ рдХреИрд╢ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реИ, рдпрд╛ рдореВрд▓реНрдп рдлрд┐рдЯ рдирд╣реАрдВ рдерд╛:
  // рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдЧрдгрдирд╛ рдХрд░реЗрдВ
  fIsPrime = slow_IsPrime (n);

  // рдХреИрд╢ рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ
  рдЕрдЧрд░ (TryAcquireSRWLockExclusive (& g_lock)) {
   nLast = n;
   fLastIsPrime = fIsPrime;
   рд▓реАрд╡реНрд╕рд╡рд░реНрд▓реЙрдХрдПрдХреНрд╕рдХреНрд▓реВрд╕рд┐рд╡ (& g_lock);
  }
  рд╡рд╛рдкрд╕реА fIsPrime;
 }

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

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


All Articles