Std :: thread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдкреИрд░ рдХреЛ рд╢реВрдЯ рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛

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


рдпрд╣рд╛рдБ std::thread рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:


 class Usage { public: Usage() : th_([this](){ run(); }) {} void run() { // Run in thread } private: std::thread th_; }; 

рдЗрд╕ рд╕рд░рд▓рддрдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдб рд╕рд╣реА рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ BUT рд╣реИ: рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ std::thread рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдордп std::thread рдЙрдкрдпреЛрдЧ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рддрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, Usage::run() рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдлрд╝реАрд▓реНрдб ( std::thread рдлрд╝реАрд▓реНрдб рдХреЗ рдмрд╛рдж рдШреЛрд╖рд┐рдд) рдХреЛ рдЕрднреА рддрдХ рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, рдпреВрдмреА рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд░реНрдЧ рдХреЛрдб рд╕реНрдХреНрд░реАрди рдкрд░ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдпрд╣ рдЬрд╛рд▓ рдПрдХ рд╢рд╛рдЦрд╛ рд╡рд┐рд░рд╛рд╕рдд рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░реЗрдВ:


 class Usage { public: Usage() : th_([this](){ run(); }) {} virtual ~Usage() noexcept {} virtual void run() {} private: std::thread th_; }; class BadUsage : public Usage { public: BadUsage() : ptr_(new char[100]) {} ~BadUsage() { delete[] ptr_; } void run() { std::memcpy(ptr_, "Hello"); } private: char* ptr_; }; 

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рдХреЛрдб рднреА рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рдХрд╛рдо рдХрд░реЗрдЧрд╛ ... рдЬрдм рддрдХ рдХрд┐ рддрд╛рд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝ рди рджреЗрдВ рддрд╛рдХрд┐ BadUsage::run() ptr_ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ ptr_ ред рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрд░рдВрднреАрдХрд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЫреЛрдЯреА рд╕реА рджреЗрд░реА рдЬреЛрдбрд╝реЗрдВ:


 class BadUsage : public Usage { public: BadUsage() : ptr_((std::this_thread::sleep_for(std::chrono::milliseconds(1)), new char[100])) {} ~BadUsage() { delete[] ptr_; } void run() { std::memcpy(ptr_, "Hello", 6); } private: char* ptr_; }; 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, BadUsage::run() рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рджреЛрд╖ рд╣реЛрддрд╛ рд╣реИ , рдФрд░ BadUsage::run() рдЧрдИ рдореЗрдореЛрд░реА рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХрд░рддрд╛ рд╣реИред


рдРрд╕реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдИ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк рджреЛ рдЪрд░рдг рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:


 class TwoPhaseUsage { public: TwoPhaseUsage() = default; ~TwoPhaseUsage() noexcept {} void start() { th_.reset(new std::thread([this](){ run(); })); } virtual void run() {} void join() { if (th_ && th_->joinable()) { th_->join(); } } private: std::unique_ptr<std::thread> th_; }; class GoodUsage : public TwoPhaseUsage { public: GoodUsage() : ptr_((std::this_thread::sleep_for(std::chrono::milliseconds(1)), new char[100])) {} ~GoodUsage() noexcept { delete[] ptr_; } void run() { std::memcpy(ptr_, "Hello", sizeof("Hello")); } private: char* ptr_; }; // ... GoodUsage gu; gu.start(); std::this_thread::sleep_for(std::chrono::milliseconds(100)); gu.join(); // ... 

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


All Articles