C / C ++ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдХреИрд╢ рдХрд╛ рддреБрд▓рдирд╛рддреНрдордХ рдкрд░реАрдХреНрд╖рдг рдФрд░ O (n) рдХреИрд╢ ** RU рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ LRU / MRU рдХреИрд╢ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ рдЗрд╕рдХрд╛ рд╡рд┐рд╡рд░рдг
рджрд╢рдХреЛрдВ рд╕реЗ, рдХрдИ рдХреИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ: рдПрд▓рдЖрд░рдпреВ, рдПрдордЖрд░рдпреВ, рдПрдЖрд░рд╕реА, рдФрд░ рдЕрдиреНрдп ... рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдХреИрд╢ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ Google рдиреЗ рдбреЗрдврд╝ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдФрд░ рдЖрдорддреМрд░ рдкрд░ StackOverflow рдкрд░ рд╕рд╡рд╛рд▓ рдЕрдиреБрддреНрддрд░рд┐рдд рд░рд╣рд╛ред рдореБрдЭреЗ рдлреЗрд╕рдмреБрдХ рд╕реЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рдорд┐рд▓рд╛ рдЬреЛ рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА рднрдВрдбрд╛рд░ рд╕реЗ рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рдХрдВрдЯреЗрдирд░реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдореЗрдВ рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб LRU рдХреИрд╢ рдЕрднреА рднреА рдмреАрдЯрд╛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
#define TBB_PREVIEW_CONCURRENT_LRU_CACHE true
рдЕрдиреНрдпрдерд╛, рд╕рдВрдХрд▓рдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯреЗрд▓ рдЯреАрдмреАрдмреА рдХреЛрдб рдореЗрдВ рдПрдХ рдЬрд╛рдВрдЪ рд╣реИ:
#if ! TBB_PREVIEW_CONCURRENT_LRU_CACHE #error Set TBB_PREVIEW_CONCURRENT_LRU_CACHE to include concurrent_lru_cache.h #endif
рдореИрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдХреИрд╢ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ - рдХреМрди рд╕рд╛ рдЪреБрдирдирд╛ рд╣реИ? рдпрд╛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд▓рд┐рдЦреЛ? рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдЬрдм рдореИрдВ рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рдХреИрд╢ ( рд▓рд┐рдВрдХ ) рдХреА рддреБрд▓рдирд╛ рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рдЕрдиреНрдп рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреНрдп рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдорд┐рд▓реЗ рдФрд░ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдЯреЗрд╕реНрдЯ рдмреЗрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛:
class IAlgorithmTester { public: IAlgorithmTester() = default; virtual ~IAlgorithmTester() { } virtual void onStart(std::shared_ptr<IConfig> &cfg) = 0; virtual void onStop() = 0; virtual void insert(void *elem) = 0; virtual bool exist(void *elem) = 0; virtual const char * get_algorithm_name() = 0; private: IAlgorithmTester(const IAlgorithmTester&) = delete; IAlgorithmTester& operator=(const IAlgorithmTester&) = delete; };
рдЗрд╕реА рддрд░рд╣, рдЗрдВрдЯрд░рдлреЗрд╕ рд▓рд┐рдкрдЯреЗ рд╣реБрдП рд╣реИрдВ: рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдкрд░реАрдХреНрд╖рдг рдХреЗ рдорд╛рдорд▓реЗ рдЖрджрд┐ред рд╕реНрд░реЛрдд рднрдВрдбрд╛рд░ рдореЗрдВ рд░рдЦреЗ рдЧрдП рд╣реИрдВ ред рд╕реНрдЯреИрдВрдб рдкрд░ рджреЛ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рд╣реИрдВ: рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде 1,000,000 рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ / рдЦреЛрдЬреЗрдВ рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде 100,000 рддрддреНрд╡реЛрдВ рддрдХ (wiki.train.tokens рд▓рд╛рдЗрдиреЛрдВ рдХреЗ 10Mb рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛)ред рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдкрд░реАрдХреНрд╖рдг рдХреИрд╢ рдХреЛ рдкрд╣рд▓реЗ рд╕рдордп рдорд╛рдк рдХреЗ рдмрд┐рдирд╛ рд▓рдХреНрд╖реНрдп рдорд╛рддреНрд░рд╛ рдореЗрдВ рдЧрд░реНрдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдорд╛рдлреЛрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдереНрд░реЗрдбреНрд╕ рдФрд░ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдкрддреНрддрд┐ / рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИрдВ ред рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╕рдВрдХрд▓рди рдирд┐рд░реНрджреЗрд╢ рдФрд░ JSON рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╡рд╛рдИрдХреЗрдЖрдИ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ ред рд╕рдордп рдХреЛ рдЙрд╕ рдХреНрд╖рдг рд╕реЗ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЕрдВрддрд┐рдо рдзрд╛рдЧрд╛ рдмрдВрдж рд╣реЛрдиреЗ рддрдХ рдЕрд░реНрдзрдХреБрдВрдн рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:
рдЯреЗрд╕реНрдЯ рдХреЗрд╕ 1 - рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА uint64_t keyArray [3]:

рдЯреЗрд╕реНрдЯ case2 - рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА:

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЗ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╕рдореНрдорд┐рд▓рд┐рдд / рдЦреЛрдЬрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ 10 рдЧреБрдирд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдлрд┐рд░, рдЬреЛ рд╕рдордп рдЕрдЧрд▓реА рдорд╛рддреНрд░рд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рдХреНрд░рдорд╢рдГ 10, 100, 1000 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ ... рдпрджрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдордп рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рдУ (рдПрди) рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕рдордп рдПрдХреНрд╕ рдЕрдХреНрд╖ рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рдирд╛рдВрддрд░ рд░рд╣реЗрдЧрд╛ред рдЕрдЧрд▓рд╛, рдореИрдВ рдкрд╡рд┐рддреНрд░ рдЬреНрдЮрд╛рди рдкреНрд░рдХрдЯ рдХрд░реВрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ред рдУ (рдПрди) рдХреИрд╢ ** рдЖрд░рдпреВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рдлреЗрд╕рдмреБрдХ рдХреИрд╢ рдкрд░ 3-5 рдЧреБрдирд╛ рд╢реНрд░реЗрд╖реНрдарддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдЬрдм рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ:
- рд╣реИрд╢ рдлрд╝рдВрдХреНрд╢рди, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдХреНрд╖рд░ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рдХреЛ uint64_t keyArray [3] рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЛ рдЧрд┐рдирддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдпрд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ "рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдУ" - рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ 3 рдиреЛрдЯреЛрдВ рджреНрд╡рд╛рд░рд╛ рд░рд╛рдЧ ... 3 * 8 = 24 рдЕрдХреНрд╖рд░ рдЕрдЧрд░ рдпрд╣ рд▓реИрдЯрд┐рди рд╣реИ, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИрд╢ рдмрд╛рд╕реНрдХреЗрдЯ рдореЗрдВ рдЖрдкрдХреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдмрд┐рдЦрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рд╛рдВ, рд╣реИрд╢ рдмрд╛рд╕реНрдХреЗрдЯ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд▓рд╛рдЗрдиреЗрдВ рдПрдХрддреНрд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рддреЗрдЬ рд╣реЛрдиреЗ рд▓рдЧрддрд╛ рд╣реИ:
- рдкреНрд░рддреНрдпреЗрдХ рдЯреЛрдХрд░реА рдореЗрдВ рдЫреЛрдбрд╝реЗрдВ рд╕реВрдЪреА рдЖрдкрдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдХреВрджрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдмрд╛рд╕реНрдХреЗрдЯ рдЖрдИрдбреА = рд╣реИрд╢% рдмрд╛рд╕реНрдХреЗрдЯ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЗрд╕рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрд╢ рдПрдХ рдЯреЛрдХрд░реА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ), рдлрд┐рд░ рдХреЛрдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╣реИрд╢ рдореЗрдВ:

- рд╡реЗ рдиреЛрдбреНрд╕ рдЬрд┐рдирдореЗрдВ рдХреБрдВрдЬреА рдФрд░ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдиреЛрдбреНрд╕ рдХреЗ рдкрд╣рд▓реЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╕рд░рдгреА рд╕реЗ рд▓рд┐рдП рдЧрдП рд╣реИрдВ, рдиреЛрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреИрд╢ рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдкрд░рдорд╛рдгреБ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдиреЛрдб рдХреЛ рдЕрдЧрд▓рд╛ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИ - рдпрджрд┐ рдпрд╣ рдиреЛрдб рдкреВрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рддреЛ рдпрд╣ 0 = рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдкреБрд░рд╛рдиреЗ рдиреЛрдбреНрд╕ ( рдСрдирдХреЗрдЪреЗрдПрдордПрд▓рдЖрд░рдпреВ рдореЗрдВ LRU рдХреИрд╢ ) рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд╕рд░реНрдХрд▓ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред
рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдЬрдм рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдЦреЛрдЬ рдкреНрд░рд╢реНрдиреЛрдВ рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рддрддреНрд╡реЛрдВ рдХреЛ рдХреИрд╢ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ OnCacheMMRU рд╡рд░реНрдЧ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ: рдХреИрд╢ рдХреНрд╖рдорддрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХреНрд▓рд╛рд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рднреА рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ uint32_t рдмреЗрдХрд╛рд░ рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреА рд╕реАрдорд╛ рд╣реИ рдЕрдЧрд░ cyc рд╕реЗ рд╡рд░реНрддрдорд╛рди рдиреЛрдб рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдЦреЛрдЬ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИред рдпрджрд┐ рд╕реАрдорд╛рдПрдВ рдмреЗрдХрд╛рд░ рд╣реИрдВ, рддреЛ рдиреЛрдб рдХреЛ рдЕрдЧрд▓реЗ рд╕рдореНрдорд┐рд▓рд┐рдд рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ рдмреЗрджрдЦрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдпрджрд┐ рдЗрд╕ рд╡реГрддреНрдд рдкрд░ рдиреЛрдб рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ (std :: atomic <uint32_t> рдкреНрд░рдпреБрдХреНрдд {0}) рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдЪрдХреНрд░реАрдп рдкреВрд▓ рд╕реЗ рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╕рдордп, рдиреЛрдб рдЬреАрд╡рд┐рдд рд░рд╣ рд╕рдХреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХрд╛рдЙрдВрдЯрд░ 0. рдкрд░ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрд╡рдВрдЯрдирдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдХрд╛ рдПрдХ рдФрд░ рдЪрдХреНрд░ рд╣реЛрдЧрд╛ рдиреЛрдбреНрд╕ рдХреЗ рдПрдХ рдкреВрд▓ рдкрд░ рдФрд░ рдореМрдЬреВрдж рд░рд╣рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рдХрд╛ рдореМрдХрд╛ рдорд┐рд▓реЗрдЧрд╛ред рдпрд╣реА рд╣реИ, рдпрд╣ рдПрдордЖрд░рдпреВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо (рдЬрд╣рд╛рдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣рдореЗрд╢рд╛ рдХреИрд╢ рдореЗрдВ рд▓рдЯрдХрд╛ рд░рд╣рддрд╛ рд╣реИ) рдФрд░ рдПрдордХреНрдпреВ (рдЬрд╣рд╛рдВ рдЬреАрд╡рдирдХрд╛рд▓ рдЯреНрд░реИрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИред рдХреИрд╢ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - 10 рд╕рд░реНрд╡рд░реЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЖрдк 1 рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рджреНрд╡рд╛рд░рд╛ рдФрд░ рдХреИрд╢рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╕рдордп рдмрд┐рддрд╛рддрд╛ рд╣реИ:
- рдХреИрд╢ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦрдирд╛ (рдХрдВрдЯреЗрдирд░, рдПрд▓реЛрдХреЗрдЯрд░, рдЬреАрд╡рдирдХрд╛рд▓ рдФрд░ рддрддреНрд╡реЛрдВ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛)
- рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рддреЗ / рдЦреЛрдЬрддреЗ рд╕рдордп рд╣реИрд╢ рдЧрдгрдирд╛ рдФрд░ рдкреНрд░рдореБрдЦ рддреБрд▓рдирд╛ рд╕рдВрдЪрд╛рд▓рди
- рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рджрдо: рд░реЗрдб-рдмреНрд▓реИрдХ рдЯреНрд░реА, рд╣реИрд╢ рдЯреЗрдмрд▓, рдЫреЛрдбрд╝реЗрдВ рд╕реВрдЪреА, ...
рдЗрди рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕рд░рд▓рддрдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдЕрдХреНрд╕рд░ рд╕рдмрд╕реЗ рдХреБрд╢рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рднреА рддрд░реНрдХ рд╕реАрдкреАрдпреВ рдЪрдХреНрд░ рд▓реЗрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЬреЛ рдХреБрдЫ рднреА рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдпреЗ рдРрд╕реЗ рдСрдкрд░реЗрд╢рди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд░рд▓ рдЧрдгрдирд╛ рд╡рд┐рдзрд┐ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдордп рдкрд░ рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЬрдмрдХрд┐ рдЕрдЧрд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЧрдгрдирд╛ рдХреЛ рдПрдХ рдФрд░ рд╕реМ рдпрд╛ рджреЛ рдиреЛрдбреНрд╕ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ, рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреИрд╢ рд╣рдореЗрд╢рд╛ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ рдЦреЛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ std :: рд╕рд╛рдЭрд╛_рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдиреЛрдбреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ std :: atomic_flag in_use рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╕реНрдХреЗрдЯ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдирд┐: рд╢реБрд▓реНрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдкрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдореБрдЦреНрдп рдПрдкреЛрд▓ рд╕рд░реНрд╡рд░ рдереНрд░реЗрдб рдореЗрдВ рдСрдирдХреЗрдЪреЗрд╕реНрдордЖрд░рдпреВ рд╕рд┐рдВрдЧрд▓-рдереНрд░реЗрдбреЗрдб рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ (рдХреЗрд╡рд▓ рдбреАрдмреАрдПрдордПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░ рд▓рдВрдмреЗ рдСрдкрд░реЗрд╢рди, рдбрд┐рд╕реНрдХ, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдореЗрдВ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рддреБрд▓рдирд╛рддреНрдордХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП, рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдЯреЗрд╕реНрдЯ рдХреЗрд╕ 1 - рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА uint64_t keyArray [3]:

рдЯреЗрд╕реНрдЯ case2 - рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдВрдЬреА:

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдмреЗрдВрдЪ рдХреЗ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдФрд░ рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- JSON рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓jjson.h рдлрд╝рд╛рдЗрд▓ рд╣реЛрддреА рд╣реИ, рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕рд░рд▓ рддреЗрдЬрд╝ рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╣реИ, рдЬреЛ рд╕реЗрдЯрд┐рдВрдЧ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЖрдиреЗ рд╡рд╛рд▓реЗ JSON рдХреЛ рдХрд┐рд╕реА рдЬреНрдЮрд╛рдд рдкреНрд░рд╛рд░реВрдк рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдФрд░ рдХреЗ рдХреЛрдб рдХреЗ рдХрд┐рд╕реА рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдирд╣реАрдВ рдЦреАрдВрдЪрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╛рд░рдВрдкрд░рд┐рдХ (#ifdef _WIN32) рдХреЗ рдмрдЬрд╛рдп (рд╡рд░реНрдЧ LinuxSystem: public ISystem {...})ред рдпрд╣ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрд░реНрдзрдЪрд╛рд▓рдХ, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреБрдбрд╝реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо - рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдХреЛрдб рдФрд░ рд╣реЗрдбрд░ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдПрдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд╡рд░реНрдЧ WindowsSystem: public ISystem {...}) рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░реЗрдВред
- рд╕реНрдЯреИрдВрдб CMake рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ - Qt Creator рдпрд╛ Microsoft Visual Studio 2017 рдореЗрдВ CMakeLists.txt рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЦреЛрд▓рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред CmakeLists.txt рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдХреБрдЫ рддреИрдпрд╛рд░реА рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдЯреЗрд╕реНрдЯ рдХреЗрд╕ рдлрд╛рдЗрд▓ рдФрд░ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓ рдХреЙрдкреА рдХрд░реЗрдВ:
- рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ C ++ 17 рдХреА рдирдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ std :: рд╕рд╛рдЭрд╛_mutex, std :: рдЖрд╡рдВрдЯрд┐рддрдХрд░реНрддрд╛ <std :: рд╕рд╛рдЭрд╛_mutex>, рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдЯреЗрдЯрд┐рдХ рдереНрд░реЗрдб_рд▓реЛрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ (рд╡рд╣рд╛рдБ рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ - рдЬрд╣рд╛рдВ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП?), рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд╢реБрд░реВ рдХрд░рдирд╛ред рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдзрд╛рдЧреЗ:
- рдЗрд╕ рдкрд░реАрдХреНрд╖рдг рдмреЗрдВрдЪ рдХреЛ рдХреИрд╕реЗ рд╕рдВрдХрд▓рд┐рдд, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд░реНрджреЗрд╢ - рд╡рд╛рдИрдХреЗрдЖрдИ ред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд░реНрджреЗрд╢ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ ISystem рдФрд░ рдЪрд░рдг-рджрд░-рдЪрд░рдг рд╕рдВрдХрд▓рди рдирд┐рд░реНрджреЗрд╢реЛрдВ (WiKi рдХреЗ рд▓рд┐рдП) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ ... рдпрд╛ рдмрд╕ рдореБрдЭреЗ рд▓рд┐рдЦреЗрдВ - рдореИрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдмрдврд╝рд╛рдиреЗ рдФрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рдЪрд░рдгреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред