рдереНрд░реЗрдб рдХрдВрд╕реАрд▓рд░ рд╕реА ++ 11, рдЗрд╕рдХреА рдмрд╛рдЗрдХ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреА (Apple) рдЬреАрд╕реАрдбреА

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐

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

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

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

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд C ++ 11 рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - std :: function, varadic рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ std :: thread рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред (std :: shared_ptr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЖрддреНрдо-рдЖрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдмреЗрд╢рдХ, рдПрдХ рдФрд░ рд▓рдХреНрд╖реНрдп рдЬреЛ рдореИрдВрдиреЗ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдоред рдФрд░ рдореБрдЭреЗ рдмрд╣реБрдд рдирд┐рд░рд╛рд╢рд╛ рд╣реБрдИ рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ Microsoft рдХрдВрдкрд╛рдЗрд▓рд░, рдЬрд┐рд╕реЗ рд╡реАрдПрд╕ 2012 рдореЗрдВ рдмрдВрдбрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдиреЗ рд╡реИрд░реЗрдбрд┐рдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдХрд╛ рдереЛрдбрд╝рд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдкрд░, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реА ++ рдирд╡рдВрдмрд░ 2012 рд╕реАрдЯреАрдкреА рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рднреА рд╣рд▓ рдХреА рдЧрдИ рдереАред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдереНрд░реЗрдб рдкреВрд▓ рдкреИрдЯрд░реНрди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдбрд┐рдЬрд╛рдЗрди рдХреЗ рджреМрд░рд╛рди, "gcdpp_t_task" рдХреЗ рджреЛ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХрд╛рд░реНрдп рдФрд░ gcdpp_t_queue - рдХрддрд╛рд░ рд╕рдВрдЪрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред

template<class FUCTION, class... ARGS> class gcdpp_t_task { protected: FUCTION m_function; std::tuple<ARGS...> m_args; public: gcdpp_t_task(FUCTION _function, ARGS... _args) { m_function = _function; m_args = std::make_tuple(_args...); }; ~gcdpp_t_task(void) { }; void execute(void) { apply(m_function, m_args); }; }; 


рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╡рд░реНрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИред рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ - рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдЧрд░ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ?

рдПрдХ рдмрд╛рд░, рдореБрдЭреЗ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдЕрднреА рднреА рдЗрдВрдЯрд░рдлреЗрд╕ / рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдкреВрд░реНрдг-рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрднрд╛рд╡ рдХреНрдпреЛрдВ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрдореВрд░реНрддрддрд╛ рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реИред рдареАрдХ рд╣реИ, рдХреБрдЫ рднреА рдирд╣реАрдВ, рдЖрдк рдПрдХ рд╕рд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 class gcdpp_t_i_task { private: protected: public: gcdpp_t_i_task(void) { }; virtual ~gcdpp_t_i_task(void) { }; virtual void execute(void) { assert(false); }; }; 


рдЕрдм, рдЯрд╛рд╕реНрдХ рдПрдмреНрд╕рдЯреНрд░реИрдХреНрд╢рди рд╕реЗ рд╣рдорд╛рд░реА рдЯрд╛рд╕реНрдХ рдХреНрд▓рд╛рд╕ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдм рдХреБрдЫ рдПрдХ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

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

 template<unsigned int NUM> struct apply_ { template<typename... F_ARGS, typename... T_ARGS, typename... ARGS> static void apply(std::function<void(F_ARGS... args)> _function, std::tuple<T_ARGS...> const& _targs, ARGS... args) { apply_<NUM-1>::apply(_function, _targs, std::get<NUM-1>(_targs), args...); } }; template<> struct apply_<0> { template<typename... F_ARGS, typename... T_ARGS, typename... ARGS> static void apply(std::function<void(F_ARGS... args)> _function, std::tuple<T_ARGS...> const&, ARGS... args) { _function(args...); } }; template<typename... F_ARGS, typename... T_ARGS> void apply(std::function<void(F_ARGS... _fargs)> _function, std::tuple<T_ARGS...> const& _targs) { apply_<sizeof...(T_ARGS)>::apply(_function, _targs); } 


рдЦреИрд░, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдкрд╛рд░рджрд░реНрд╢реА рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдпрд╣ рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде "рдереНрд░реЗрдб рдкреВрд▓" рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИред

  class gcdpp_t_queue { private: protected: std::mutex m_mutex; std::thread m_thread; bool m_running; void _Thread(void); public: gcdpp_t_queue(const std::string& _guid); ~gcdpp_t_queue(void); void append_task(std::shared_ptr<gcdpp_t_i_task> _task); }; 


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

рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдХреЛ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдХрд╛рдордХрд╛рдЬреА рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реИред

 class gcdpp_impl { private: protected: friend void gcdpp_dispatch_init_main_queue(void); friend void gcdpp_dispatch_update_main_queue(void); friend std::shared_ptr<gcdpp_t_queue> gcdpp_dispatch_get_global_queue(gcdpp::GCDPP_DISPATCH_QUEUE_PRIORITY _priority); friend std::shared_ptr<gcdpp_t_main_queue> gcdpp_dispatch_get_main_queue(void); template<class... ARGS> friend void gcdpp_dispatch_async(std::shared_ptr<gcdpp_t_main_queue> _queue, std::function<void(ARGS... args)> _function, ARGS... args); std::shared_ptr<gcdpp_t_main_queue> m_mainQueue; std::shared_ptr<gcdpp_t_queue> m_poolQueue[gcdpp::GCDPP_DISPATCH_QUEUE_PRIORITY_MAX]; static std::shared_ptr<gcdpp_impl> instance(void); std::shared_ptr<gcdpp_t_queue> gcdpp_dispatch_get_global_queue(gcdpp::GCDPP_DISPATCH_QUEUE_PRIORITY _priority); std::shared_ptr<gcdpp_t_main_queue> gcdpp_dispatch_get_main_queue(void); template<class... ARGS> void gcdpp_dispatch_async(std::shared_ptr<gcdpp_t_main_queue> _queue, std::function<void(ARGS... args)> _function, ARGS... args); public: gcdpp_impl(void); ~gcdpp_impl(void); }; 


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

рдмрд╛рдХреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдкрд╛рд░рджрд░реНрд╢реА рд▓рдЧрддрд╛ рд╣реИ:

gcdpp_dispatch_get_global_queue - рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
gcdpp_dispatch_get_main_queue - рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдкрд░ рдПрдХ рдХрддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
gcdpp_dispatch_async - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рдЖрд╕реНрдердЧрд┐рдд рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрддрд╛рд░ рдСрдкрд░реЗрд╢рди рдбрд╛рд▓рддрд╛ рд╣реИред

рдЖрд╡реЗрджрди

рдФрд░ рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ?
рдореИрдВ рдХрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдкрд░ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд╛рдн рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛:

 std::function<void(int, float, std::string)> function = [](int a, float b, const std::string& c) { std::cout<<<<a<<b<<c<<std::endl; }; gcdpp::gcdpp_dispatch_async<int, float, std::string>(gcdpp::gcdpp_dispatch_get_global_queue(gcdpp::GCDPP_DISPATCH_QUEUE_PRIORITY_HIGH), function, 1, 2.0f, "Hello World"); 


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд▓рдВрдмреЛрджрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдШреЛрд╖рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рдореЗрдВ рд╕реНрдердЧрд┐рдд рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

 class Clazz { public: int m_varible; void Function(int _varible) { m_varible = _varible; }; }; std::shared_ptr<Clazz> clazz = std::make_shared<Clazz>(); clazz->m_varible = 101; std::function<void(std::shared_ptr<Clazz> )> function = [](std::shared_ptr<Clazz> clazz) { std::cout<<"call"<<clazz->m_varible<<std::endl; }; gcdpp::gcdpp_dispatch_async<std::shared_ptr<Clazz>>(gcdpp::gcdpp_dispatch_get_global_queue(gcdpp::GCDPP_DISPATCH_QUEUE_PRIORITY_HIGH), function, clazz); 


рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╕реНрдЯрдо рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЖрд╕реНрдердЧрд┐рдд рдСрдкрд░реЗрд╢рди рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

 void CParticleEmitter::_OnTemplateLoaded(std::shared_ptr<ITemplate> _template) { std::function<void(void)> function = [this](void) { std::shared_ptr<CVertexBuffer> vertexBuffer = std::make_shared<CVertexBuffer>(m_settings->m_numParticles * 4, GL_STREAM_DRAW); ... m_isLoaded = true; }; thread_concurrency_dispatch(get_thread_concurrency_main_queue(), function); } 


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

рдирд┐рд╖реНрдХрд░реНрд╖

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

рд╕реЛрд░реНрд╕ рдХреЛрдб рдУрдкрди рдПрдХреНрд╕реЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдореЗрдВ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред рд╡реАрдПрд╕ 2012 рдХреЗ рддрд╣рдд, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЕрднреА рддрдХ рдзрдХреНрдХрд╛ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЬрд▓реНрдж рд╣реА рд╡рд╣рд╛рдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдкреАрдПрд╕ рдХреА рдкрд░реНрдпрд╛рдкреНрдд рдЖрд▓реЛрдЪрдирд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ ...

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


All Articles