рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ред рднрд╛рдЧ 1. рдмреБрд░рд╛рдИ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рдирд╛ рдпрд╛ рди рдХрд░рдирд╛

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

рдпрд╣ рдХрд┐рд╕реА рднреА рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬреЛ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рд╕реЗ рдХреБрдЫ рдмрдбрд╝рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░рдиреЗ рдореЗрдВ рдмрд╣реБ-рд╕реВрддреНрд░рд┐рдд рд╣реИ рдХрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдмрдирд╛рдирд╛ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рдХрдард┐рди рд╣реИ - рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЪреИрдирд▓ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ, рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдмрджрд▓реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реИрдбрд░ рдЯреЗрдмрд▓ рдЯреНрд░реА рдХреЛ рдШреБрдорд╛рдПрдВ), рдХреНрдпрд╛ рдЙрдард╛рдПрдВ рдХрддрд╛рд░ рд╕реЗ, рдЖрджрд┐ред
рдРрд╕реА рдкрд╣реБрдВрдЪ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдХреЗ, рд╣рдо рдХреЛрдб рдХреЗ рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧреЛрдВ рдХреЗ рдПрдХ рд╕рд╛рде рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдПрдХ рд╣реИ, рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрдИ рдзрд╛рдЧреЗ (рдЬреИрд╕реЗ 1 рд▓реЗрдЦрдХ / рдПрди рдкрд╛рдардХ)ред
рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реИред рдЕрддреНрдпрдзрд┐рдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмрд╣реБрдд рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реИ - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ 2 рдпрд╛ 3 рдереНрд░реЗрдбреНрд╕ рдкрд░ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рд╕реНрдорд╛рд░реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓рдЧрднрдЧ 5 рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ "рд╕рд┐рдВрдЧрд▓рдереНрд░реЗрдб" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ 20 рдкрд░ рднреА рд▓рдЧрднрдЧ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдмрд┐рд╕реНрддрд░ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред

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

рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рд╕реЗрдорд╛рдлреЛрд░ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рди рдХреЗрд╡рд▓ рдЙрди рдкрд░ ReadWriteMutex рдирд┐рд░реНрдорд╛рдг рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рд▓реЛрдб рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдорд╛рдлреЛрд░рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдмрд╣реБрдд рд╕реЗ "рд▓рд╛рдареА" рдХреЛ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд░рдХреЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдЬрдм, рдереНрд░реЗрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде, рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛рдлрд╝реА рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди рдпрд╛ рддреБрд▓рдиреАрдп рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
Profiler- рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВ
======================================================================================================================== Run # 1 (5 Threads) rpcsd (hbgsrv0189, PID:0718, TID:2648) # 03-09-2012 | 13:50:45 | Servlet: A::RpcsServlet, URI: /index-search ======================================================================================================================== NS | Name | C | T | Tot(s) | TwR(s) | Avg(s) | AwR(s) | Max(s) | Min(s) ======================================================================================================================== ::RPC::Service | service | 1 | 1 | 1.593 | 1.593 | 1.593 | 1.593 | 1.593 | 1.593 ::A::RpcsServlet | service | 1 | 1 | 1.592 | 1.592 | 1.592 | 1.592 | 1.592 | 1.592 ::IndexSrvRpc | index-search | 1 | 1 | 1.584 | 1.584 | 1.584 | 1.584 | 1.584 | 1.584 ::Indexer::Search | Search | 1 | 1 | 1.584 | 1.584 | 1.584 | 1.584 | 1.584 | 1.584 ::Indexer::Search | ParallelSearch | 2 | 2 | 1.256 | 1.256 | 0.628 | 0.628 | 0.655 | 0.601 ::Indexer::Search::Cache | SearchL2Index | 44 | 44 | 0.686 | 0.686 | 0.016 | 0.016 | 0.016 | 0.015 ::Indexer::Search | InvalidateCacheIdx | 20 | 20 | 0.570 | 0.570 | 0.028 | 0.028 | 0.031 | 0.020 ::Indexer::Search::Cache | InvalidateIdx | 20 | 20 | 0.276 | 0.276 | 0.014 | 0.014 | 0.016 | 0.002 ::Indexer::Search | SearchL1Index | 1 | 14 | 0.203 | 0.203 | 0.203 | 0.016 | 0.203 | 0.016 ::Indexer::Search | MergeJoin | 1 | 1 | 0.125 | 0.125 | 0.125 | 0.125 | 0.125 | 0.125 ======================================================================================================================== Run # 2 (25 Threads w/o semaphore) rpcsd (hbgsrv0189, PID:0718, TID:2648) # 03-09-2012 | 13:52:03 | Servlet: A::RpcsServlet, URI: /index-search ======================================================================================================================== NS | Name | C | T | Tot(s) | TwR(s) | Avg(s) | AwR(s) | Max(s) | Min(s) ======================================================================================================================== ::RPC::Service | service | 1 | 1 | 4.255 | 4.255 | 4.255 | 4.255 | 4.255 | 4.255 ::A::RpcsServlet | service | 1 | 1 | 4.254 | 4.254 | 4.254 | 4.254 | 4.254 | 4.254 ::IndexSrvRpc | index-search | 1 | 1 | 4.244 | 4.244 | 4.244 | 4.244 | 4.244 | 4.244 ::Indexer::Search | Search | 1 | 1 | 4.244 | 4.244 | 4.244 | 4.244 | 4.244 | 4.244 ::Indexer::Search | ParallelSearch | 2 | 2 | 3.729 | 3.729 | 1.865 | 1.865 | 1.889 | 1.840 ::Indexer::Search | InvalidateCacheIdx | 20 | 20 | 2.497 | 2.497 | 0.125 | 0.125 | 0.126 | 0.125 ::Indexer::Search::Cache | InvalidateIdx | 20 | 20 | 2.188 | 2.188 | 0.109 | 0.109 | 0.113 | 0.109 ::Indexer::Search::Cache | SearchL2Index | 44 | 44 | 1.231 | 1.231 | 0.028 | 0.028 | 0.031 | 0.015 ::Indexer::Search | SearchL1Index | 1 | 14 | 0.360 | 0.360 | 0.360 | 0.028 | 0.360 | 0.016 ::Indexer::Search | MergeJoin | 1 | 1 | 0.155 | 0.155 | 0.155 | 0.155 | 0.155 | 0.155 ======================================================================================================================== Run # 3 (25 Threads with semaphore in InvalidateCacheIdx, before InvalidateIdx) rpcsd (hbgsrv0189, PID:0718, TID:2648) # 03-09-2012 | 14:02:51 | Servlet: A::RpcsServlet, URI: /index-search ======================================================================================================================== NS | Name | C | T | Tot(s) | TwR(s) | Avg(s) | AwR(s) | Max(s) | Min(s) ======================================================================================================================== ::RPC::Service | service | 1 | 1 | 2.213 | 2.213 | 2.213 | 2.213 | 2.213 | 2.213 ::A::RpcsServlet | service | 1 | 1 | 2.213 | 2.213 | 2.213 | 2.213 | 2.213 | 2.213 ::IndexSrvRpc | index-search | 1 | 1 | 2.205 | 2.205 | 2.205 | 2.205 | 2.205 | 2.205 ::Indexer::Search | Search | 1 | 1 | 2.205 | 2.205 | 2.205 | 2.205 | 2.205 | 2.205 ::Indexer::Search | ParallelSearch | 2 | 2 | 1.690 | 1.690 | 0.845 | 0.845 | 0.889 | 0.801 ::Indexer::Search::Cache | SearchL2Index | 44 | 44 | 1.153 | 1.153 | 0.026 | 0.026 | 0.031 | 0.016 ::Indexer::Search | InvalidateCacheIdx | 20 | 20 | 0.537 | 0.537 | 0.027 | 0.027 | 0.031 | 0.007 ::Indexer::Search | SearchL1Index | 1 | 14 | 0.359 | 0.359 | 0.359 | 0.028 | 0.359 | 0.017 ::Indexer::Search::Cache | InvalidateIdx | 20 | 20 | 0.278 | 0.278 | 0.014 | 0.014 | 0.016 | 0.004 ::Indexer::Search | MergeJoin | 1 | 1 | 0.156 | 0.156 | 0.156 | 0.156 | 0.156 | 0.156 


рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рддреАрд╕рд░реЗ рдЕрдВрдХ рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ InvalidateIdx рдкрджреНрдзрддрд┐ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдФрд░, рддрджрдиреБрд╕рд╛рд░ invCI_semaphore semaphore InvalidateIdx рд╡рд┐рдзрд┐ invCI_semaphore рдХреЙрд▓ рд╕реЗ invCI_semaphore рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, InvalidateCacheIdx рд╡рд┐рдзрд┐ рдмрджрд▓ invCI_semaphore
 semaphore invCI_semaphore(config.InvCI_Count/* = 5*/); ... int InvalidateCacheIdx() { ... while (...) { cache.SearchL2Index(); invCI_semaphore++; while (cache.InvalidateIdx()) {}; invCI_semaphore--; } ... } 

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

рдкреНрд░рд╛рдердорд┐рдХрддрд╛ (рдкреНрд░рд╛рдердорд┐рдХрддрд╛)

рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрдВрддреНрд░ рд╣реИрдВ, рдЬреЛ рдЖрд╡реЗрджрди рдХреЛ "рд╣рд▓реНрдХрд╛" рдХрд░рдиреЗ рдореЗрдВ рднреА рдХрд╛рдлреА рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╕рд┐рд╕реНрдЯрдо рд▓реЙрдЧ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ, рддреЛ рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ рдХрдо рдХрд░рдХреЗ, рдЖрдк рд▓реЙрдЧ-рд▓реЗрд╡рд▓ рдХреЛ рдХрдо рдХрд┐рдП рдмрд┐рдирд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрд╣реБрдд "рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдбрд┐рдЬрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдкреВрд▓ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ:
 // before doing ... if ( thisThread.pool.count() > 1 && !(currentTaskType in (asap, immediately, now)) ) { thisThread.priority = 2 * thisThread.pool.priority; } else { thisThread.priority = 5 * thisThread.pool.priority; } // do current task ... 

рдЙрд╕реА рд╕рдордп, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реИ, рдФрд░ рди рдХреЗрд╡рд▓ рдЙрд╕ рдкреВрд▓ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕реНрдЯреНрд░реАрдо рдореМрдЬреВрдж рд╣реИ - рд╕рд╛рд╡рдзрд╛рдиреА рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдбрд┐рд╡рд╛рдЗрдб рдПрдЯ рдПрдореНрдкрд╛ (рдбрд┐рд╡рд╛рдЗрдб рдПрдВрдб рдХреЙрдиреНрдХрд░)

рдЕрдХреНрд╕рд░, рдХреЛрдб рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдХреЗ рддрддреНрдХрд╛рд▓ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рдЕрд░реНрдерд╛рддред рдХреБрдЫ рдХрд╛рд░реНрдп рдпрд╛ рдХрд╛рд░реНрдп рдХрд╛ рдХреБрдЫ рднрд╛рдЧ рд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧ рд▓рд┐рдЦрдирд╛, рд╡рд┐рдЬрд╝рд┐рдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛, рдХреИрд╢ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЖрджрд┐ред
рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдмрд╛рдж рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрдерд╛рдХрдерд┐рдд рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧрд╛, рдПрдХ рдереНрд░реЗрдб рдкреВрд▓ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдФрд░ рдЙрд░реНрдл тАЛтАЛрдЖрд░рдкреАрд╕реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реЗрдмрд╕рд░реНрд╡рд┐рд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЙрд▓)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рдХреЙрд▓ (рдХрддрд╛рд░рдмрджреНрдз, рдЖрджрд┐) рдХрд╛ рд╕рдордп рд▓рд╛рдЧрдд рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд▓рд╛рдЧрдд рд╕реЗ рдХрдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдЕрд▓рдЧ рд▓реЙрдЧ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг:
 //      : int log(int level, ...) { if (level >= level2log) { logMutex.lock(); try { file.write(...); file.flush(); } finally { logMutex.release(); } } } 


 //  -  : int log(int level, ...) { if (level >= level2log) { // ,     : logQueue.mutex.lock(); logQueue.add(currentThread.id, ...); logQueue.mutex.release(); //  -worker' : logQueue.threadEvent.pulse(); } } // background-logging thread: int logThreadProc() { ... while (true) { //   -   /* 500 ms */    /* 10 */: if ( logQueue.count < config.LogMaxCount /* = 10 */ || (sleepTime = currentTime - lastTime) < config.LogLatency /* = 500 */) { logQueue.threadEvent.wait(config.LogLatency - sleepTime); continue; }; //        : logQueue.mutex.lock(); try { foreach (... in logQueue) { file.write(...); logQueue.delete(...); } } finally { logQueue.mutex.release(); } //    : file.flush(); //  : logQueue.threadEvent.wait(); lastTime = currentTime; } ... } 

рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рд╕рд░рд▓ рдбрд┐рдЬрд╛рдЗрди рд▓реЙрдЧрд┐рдВрдЧ рдХреА рд▓рд╛рдЧрдд рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреА рд╣реИ, рдЬреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ log рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░реЗрдЧреАред
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдм, рд▓реЙрдЧрд┐рдВрдЧ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХ рдХреЛ рд▓рдЯрдХрд╛рддреЗ рд╣реБрдП, рдХреЗрд╡рд▓ рд▓реЙрдЧ рдХреЛ рд╕реАрдзреЗ рд▓рд┐рдЦрдиреЗ рдХреА рдзрд╛рд░рд╛ рд▓реЛрдб рд╣реЛрддреА рд╣реИред рдпрд╛рдиреА рдЖрдк рд╣рдорд╛рд░реЗ рд▓реЙрдЧ рдХреЛ рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВ рдЙрддрдирд╛ рдЕрдзрд┐рдХ рдмреБрджреНрдзрд┐рдорд╛рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЙрдЬрд┐рдЯреЗрдВрд╕реА рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреЗрд╢ рдХрд░реЗрдВ, рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЙрдЧ рдПрдирд╛рд▓рд╛рдЗрдЬрд╝рд░ (рдХреБрдЫ рдРрд╕рд╛ рдХрд░реЗрдВ рдЬреИрд╕реЗ рдХрд┐ рд╡рд┐рдлрд▓ 2ban) рдпрд╛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рднреА рдбреАрдмрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ, TID рджреНрд╡рд╛рд░рд╛ рд╕рдореВрд╣ , рдЖрджрд┐ред - рдпрд╣ рд╕рдм рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдмрд╛рдХреА рдзрд╛рдЧреЛрдВ рдХреЛ рд▓реЛрдб рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп (рд╕рдВрджреЗрд╢ рд╕реАрдзреЗ рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рдереНрд░реЗрдбреНрд╕ рдХреЛ "рд╕рдорд╛рдирд╛рдВрддрд░" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╛рдиреА рдЕрдзрд┐рдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдореНрдпреВрдЯреЗрдХреНрд╕, рдХреНрд░рд┐рдЯрд┐рдХрд▓ рд╕реЗрдХреНрд╢рди, рд╡реЗрдЯрд┐рдВрдЧ рдЗрд╡реЗрдВрдЯреНрд╕) рдФрд░ рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХреА рд▓рд╛рдЧрдд рдЬрд┐рддрдиреА рдЕрдзрд┐рдХ рд╣реЛрдЧреА, рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╛рдиреА рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдпрд╛ рдЗрд╕рдХреЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрддрд┐ рд╕реЗ рднреА рдмрджрддрд░ рд╣реЛ рдЬрд╛рддреА рд╣реИред рд▓реЙрдХ () рдФрд░ рд░рд┐рд▓реАрдЬрд╝ () рдХреЗ рдмреАрдЪ рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдб рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдереНрд░реЗрдб рдореЗрдВ рд╕реНрд╡рдпрдВ рддреЗрдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ "рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг" рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред
рдШрдЯрдирд╛рдУрдВ рдХреА рдХрддрд╛рд░ рдЖрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрднреА-рдХрднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓рд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХрддрд╛рд░рдмрджреНрдз рдХрд░рдирд╛ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕рдордп" рдХреЗ рджреМрд░рд╛рди, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдореЗрдВ, рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВред
рдЗрд╕реЗ рдЯреАрд╕реАрдПрд▓ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 ##   /  ... ... ##  counter : set counter [db onecolumn {select cntr from accesslog where userid = $userid}] %>     <%= $counter %> ... <% ##   " access log" in background,    "update idle": after idle UpdateAccess $userid [clock seconds] ## . .... ## -    : proc UpdateAccess {userid lasttime} { db exec {update accesslog set cntr = cntr + 1, lastaccess = $lasttime where userid = $userid} } 


рдХрддрд╛рд░, FIFO, LIFO, рдФрд░ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ

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

рдЬреАрд╡рди рдЙрджрд╛рд╣рд░рдг - рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ рдореЗрдВ, рдПрдХ рд╣реИрд╢ рдЯреЗрдмрд▓ рдПрдХ рд╣реА рдЖрдХрд╛рд░ рдХреА рдореБрдлреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреВрд▓ рд╕реЗ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ malloc / free рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :)ред mymalloc рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреВрд▓ рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - mymalloc рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЛ рд▓реМрдЯрд╛рдпрд╛, рдмрд╣реБрдд рдкрд╣рд▓реЗ myfree рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреВрд▓ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╣ рдХрд╛рд░рдг рдЬрд┐рд╕рдиреЗ рдбреЗрд╡рд▓рдкрд░ рдХреЛ FIFO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рддреЛ рд╡рд╣ myfree рдХреЗ рдмрд┐рдВрджреБ рдкрд░ рд╕рд░рд▓ рд╣реИ - рдпрджрд┐ рдХреБрдЫ рдмреЗрдИрдорд╛рди "рдкреНрд░реЛрдЧреНрд░рд╛рдорд░" рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП myfree рдХреЗ рдмрд╛рдж рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрднрд╡рддрдГ рдЕрдзрд┐рдХ рд╕рдордп рддрдХ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рдЗрд╕реЗ LIFO рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рдВрдкреВрд░реНрдг рд╢рд╕реНрддреНрд░рд╛рдЧрд╛рд░ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░) рдЬреЛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓рдЧрднрдЧ 30% рддреЗрдЬреА рд╕реЗ рдЕрд░реНрдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

ReadWriteMutex

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

рдкреНрд░рд▓реЗрдЦрди рдкрдврд╝реЗрдВ, рд╕реНрд░реЛрдд рдХреЛрдб рдкрдврд╝реЗрдВ

рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдпрд╛ рд╡рд╕реНрддреБ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкреА рд╣реБрдИ рдЕрдЬреНрдЮрд╛рдирддрд╛ рдХреА рд╕рдорд╕реНрдпрд╛, рдХрднреА-рдХрднреА рдЧрд▓рддрдлрд╣рдореАред рдпрд╣ рдореВрд▓ рддреБрд▓реНрдпрдХрд╛рд▓рди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдЪ рд╣реИред рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрд░рдбрдмреНрд▓реНрдпреВ-рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рдЕрдиреБрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред
рдореЗрд░реЗ рдПрдХ рд╕рд╣рдХрд░реНрдореА рдиреЗ рдПрдХ рдмрд╛рд░ рдЙрдЪрд┐рдд рдЖрд░рдбрдмреНрд▓реНрдпреВ-рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рд╕реЗрдорд╛рдлреЛрд░рд╕ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдерд╛ред рд╡рд╣ RWMutex рд╡рд░реНрдЧ рдореЗрдВ рдкрд╛рдардХ рдзрд╛рд░рд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рдерд╛ (рдЙрд╕рдиреЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ "рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡" рдорд╛рди 500 рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛) рдФрд░ рд▓реЗрдЦрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХреЛрдб рд▓рд┐рдЦрд╛:
 ... RWMutex mtx(500); ... mtx.lockWrite(); hashTab.add(...); mtx.releaseWrite(); ... 

рдФрд░ рдПрдХ рдЕрдЪреНрдЫреЗ рд▓реЛрдб рдХреЗ рд╕рд╛рде, рд╕рд░реНрд╡рд░ рдЧрд╣рд░реА рджреНрд╡рд┐ рдШрд╛рддреБрдорд╛рди рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рд╣рд╛рдЗрдмрд░рдиреЗрд╢рди рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛ред рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЙрд╕рдиреЗ рджреЛ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреАрдВ - 500 рдХрд╛ рд╕реНрдереИрддрд┐рдХ рдореВрд▓реНрдп рд▓реЗрдирд╛ рдФрд░ рдпрд╣ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд░рдбрдмреНрд▓реНрдпреВ-рдореНрдпреВрдЯреЗрдХреНрд╕ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдордВрдЪ рдкрд░ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗред рдХреНрдпреЛрдВрдХрд┐ рдЖрд░рдбрдмреНрд▓реНрдпреВ-рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдЙрдЪрд┐рдд рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рдорд╛рди рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
 void RWMutex::lockWrite() { writeMutex.lock(); for (register int i = 0; i < readersCount /*    500 */; i++) readSemaphore++; } void RWMutex::releaseWrite() { if (!f4read) writeMutex.release(); readSemaphore -= readersCount; if (f4read) writeMutex.release(); } 

рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди, readSemaphore += readersCount рдмрдЬрд╛рдп lockWrite рдмреЙрдбреА рдореЗрдВ рд▓реВрдк рдореЗрдВ readSemaphore++ рд╡реГрджреНрдзрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг, рдкрд╛рдардХ рдФрд░ рд▓реЗрдЦрдХ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИред рд╢рд╛рдпрдж рд╡рд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдерд╛ рдХрд┐ рдЗрд╕ RWMutex рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдорд╛рдлреЛрд░ рд╡рд░реНрдЧ рдиреЗ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдХреЛрдб рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рдерд╛:
 int Semaphore::operator ++() { mutex.lock(); if (sema++ > MaxFlowCount) flowMutex.lock(); mutex.release(); } 

рдпрд╛рдиреА рдЬрдм hashTab рд╣реИрд╢ рдЯреЗрдмрд▓ рдореЗрдВ 100 рдорд╛рди рдЬреЛрдбрд╝реЗ рдЧрдП рдереЗ, рдЙрд╕реА рд╕рдордп рдХрдИ рд░реАрдбрд░ рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдкрдврд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 100 * 500 рддрд╛рд▓реЗ рдереЗ (рдФрд░ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рдорд┐рд▓реАрд╕реЗрдХреЗрдВрдб рдЕрд╡рдХреНрд╖реЗрдкрд┐рдд рдереЗ)ред рдЗрд╕ рдХрд╣рд╛рдиреА рдореЗрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ RWSyncHashTable рдерд╛, рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛ред
рдзреНрдпрд╛рди рд░рдЦреЗрдВ: рдХреБрдЫ рдПрдкреАрдЖрдИ рдирд┐рд░реНрдорд╛рдг рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд┐рдВрдХ рдореЗрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдХрднреА-рдХрднреА рдпрд╣ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рднреА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдЕрдХреНрд╕рд░ рд╣рд╛рдирд┐рдХрд╛рд░рдХ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдмрд╕ рдорд╛рдорд▓рд╛ рд╣реИ рдЬрдм рдЖрдк рджрд▓рд┐рдпрд╛ рдХреЛ рдордХреНрдЦрди рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкрдврд╝реЗрдВ, рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВ - рдФрд░ рдРрд╕реА рдЧрд▓рддрд┐рдпреЛрдВ рд╕реЗ рдЖрдкрдХреЛ рдмрд╛рдИрдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред

рд╕рдордХрд╛рд▓рд┐рдХ! = рдкреНрд░рддреАрдХреНрд╖рд╛рд░рдд

рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдорддрд▓рдм рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рд╡рд╣реА рдХрд░рддреА рд╣реИ рдЬреЛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддреА рд╣реИред рдЖрдзреБрдирд┐рдХ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдЕрд╡рд░реБрджреНрдз рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╛рдлреА рд▓рдЪреАрд▓реЗ рд╣реИрдВ, рдФрд░ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ:
 static int mtx_locked = 0; //   - - ,  1 ? while ( mtx_locked || !mtx.lock(config.MaxWaitTime /*  1 ms */) ) { //    -  -  ...  ... processNextRequest(); } //   -  ... mtx_locked++; //  ... processInLock(); // unlock ... mtx_locked--; mtx.release(); 

рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рд▓реЙрдХ рдХрд░рдиреЗ рдФрд░ рдмрд┐рд╕реНрддрд░ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдордп рдХреБрдЫ рдФрд░ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдПрдХ рд╕рдорд╛рди рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдХреНрд╕рд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреЙрд▓рдмреИрдХ рдпрд╛ рдИрд╡реЗрдВрдЯ рдирд┐рд╖реНрдкрд╛рджрди, рдЯреНрд░рд╛рдВрд╕реЗрдХреНрд╢рдирд▓ рдиреЛрдПрдЯ рд▓реЙрдХрд┐рдВрдЧ, рдкреНрд░рддрд┐ рдереНрд░реЗрдб-рдХреИрд╢рд┐рдВрдЧ, рдЖрджрд┐), рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ - "рдкреНрд░рддреАрдХреНрд╖рд╛ рди рдХрд░реЗрдВред"
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рд╕реЗ рдмрдЪрдиреЗ рдпрд╛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЪрд╛рд▓ рджрд┐рдЦрд╛рддрд╛ рд╣реИ: рдпрд╣ рдПрдХ рд╕реНрдерд┐рд░ рдЪрд░ mtx_locked ред рдпрд╣ рддрдХрдиреАрдХ рдЖрдкрдХреЛ mtx.lock рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдпрджрд┐ рдпрд╣ mtx.lock рд╕реЗ mtx.lock рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдХреЛрдб рдЕрд╡рд░реБрджреНрдз рд╣реИ ( mtx_locked > 0 ), рдФрд░ рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рд╣рдо рдмрд╕ рдХреБрдЫ рдФрд░ рдХрд░рддреЗ рд╣реИрдВред

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

рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ:

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


All Articles