рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рджреЗрдм рд╣рд▓рджрд░ рджреНрд╡рд╛рд░рд╛
"рдЯреЙрдк 20 рд╕реА ++ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЙрдирд╕реЗ рдХреИрд╕реЗ рдмрдЪрд╛ рдЬрд╛рдП" рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рд▓рд╛рддрд╛ рд╣реВрдВред
рдлрд┐рд▓реНрдо "рдж рд▓реВрдк рдСрдл рдЯрд╛рдЗрдо" рд╕реЗ рджреГрд╢реНрдп (2012)рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рд╕реА ++ рдореЗрдВред рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдореИрдВрдиреЗ рдХрдИ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреАрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреЛрдб рдФрд░ рдкрд░реАрдХреНрд╖рдг рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рдереАред рдлрд┐рд░ рднреА, рдХрд┐рд╕реА рддрд░рд╣ рдЙрддреНрдкрд╛рджрдХ рдкрд░ рдлрд┐рд╕рд▓ рдЧрдпрд╛, рдФрд░ рд╣рдореЗрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рд╣рдореЗрд╢рд╛ рдорд╣рдВрдЧрд╛ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрди рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд░реНрдЧреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдирддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╛ рд╡рд░реНрдгрд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЭрд╛рд╡ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рд▓реЗрдЦ рдХреЗ рддрд╣рдд рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреЗрдВред
рдЧрд▓рддреА # 1: рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЙрдЗрди () рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
рдпрджрд┐ рдЖрдк рд╕реНрдЯреНрд░реАрдо (
рдЬреНрд╡рд╛рдЗрди () ) рдореЗрдВ
рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕реЗ
рдЕрд▓рдЧ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВ (detach
() рдЗрд╕реЗ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд░рддреЗ), рддреЛ рдЗрд╕рд╕реЗ рджреБрд░реНрдШрдЯрдирд╛ рд╣реЛ рдЬрд╛рдПрдЧреАред (рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢рдмреНрдж рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреЗ
() рдФрд░
рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ
рдЕрд▓рдЧ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ
() , рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдирд╣реАрдВ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдореНрдорд┐рд▓рд┐рдд
рд╣реЛрдВ () рд╡рд╣ рдмрд┐рдВрджреБ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдзрд╛рдЧрд╛ рджреВрд╕рд░реЗ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рдЬреБрдбрд╝рдиреЗ рдпрд╛ рдереНрд░реЗрдб рдХреЗ рд╡рд┐рд▓рдп рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред [рдЯрд┐рдкреНрдкрдгреА рдЕрдиреБрд╡рд╛рджрдХ])ред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдореБрдЦреНрдп рд╕реВрддреНрд░ рдореЗрдВ рдереНрд░реЗрдб t1 рдХреЗ
рдЬреБрдбрд╝рдиреЗ () рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рднреВрд▓ рдЧрдП:
#include "stdafx.h"
#include <iostream>
#include <thread>
using namespace std ;
void LaunchRocket ( )
{
cout << "Launching Rocket" << endl ;
}
int main ( )
{
thread t1 ( LaunchRocket ) ;
//t1.join(); // join-
return 0 ;
}
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рдХреНрдпреЛрдВ рд╣реБрдЖ! рдХреНрдпреЛрдВрдХрд┐
рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЪрд░ t1 рдХрд╛рд░реНрдпрдХреНрд╖реЗрддреНрд░ рд╕реЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдереНрд░реЗрдб рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрд╣рд╛ рдЧрдпрд╛ред
рдбрд┐рд╕реНрдЯреНрд░реЙрдХреНрдЯрд░ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдереНрд░реЗрдб t1 рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдпреЛрдЧреНрдп рд╣реИ
рдпрд╛ рдирд╣реАрдВ ред рдПрдХ рдзрд╛рдЧрд╛ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдЕрдЧрд░ рдЗрд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
std :: рд╕рдорд╛рдкреНрддрд┐ рдХреЛ рдЗрд╕рдХреЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, MSVC ++ рд╕рдВрдХрд▓рдХ рдХрд░рддрд╛ рд╣реИред
~thread ( ) _NOEXCEPT
{ // clean up
if ( joinable ( ) )
XSTD terminate ( ) ;
}
рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
1. рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдзрд╛рдЧрд╛ t1
рдХреА рдХреЙрд▓
рдЬреЙрдЗрди () рдХрд░реЗрдВ :
int main ( )
{
thread t1 ( LaunchRocket ) ;
t1. join ( ) ; // join t1,
return 0 ;
}
2. рдзрд╛рд░рд╛ рдзрд╛рд░рд╛ 1 рдХреЛ рдореБрдЦреНрдп рдзрд╛рд░рд╛ рд╕реЗ рдЕрд▓рдЧ рдХрд░реЗрдВ, рдЗрд╕реЗ "рдбреАрдорд░реНрд▓рд╛рдЗрдЬреНрдб" рд╕реНрдЯреНрд░реАрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ:
int main ( )
{
thread t1 ( LaunchRocket ) ;
t1. detach ( ) ; // t1
return 0 ;
}
рдЧрд▓рддреА # 2: рдкрд╣рд▓реЗ рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдзрд╛рдЧреЗ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛
рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдХрд╛рдо рдХреЗ рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ
рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдореБрдЦреНрдп рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдЧрд▓рддреА рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрдирдкрд┐рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдХреЛрдб рдХреА рдХреБрдЫ рд╕реМ рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдкреБрди: рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░ рдХреМрди рдпрд╛рдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрд╕рдиреЗ 300 рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦреА рдереАрдВ, рд╣реИ рдирд╛?
рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдмрдЬрд╛рдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
#include "stdafx.h"
#include <iostream>
#include <thread>
using namespace std ;
void LaunchRocket ( )
{
cout << "Launching Rocket" << endl ;
}
int main ( )
{
thread t1 ( LaunchRocket ) ;
t1. detach ( ) ;
//..... 100 -
t1. join ( ) ; // CRASH !!!
return 0 ;
}
рд╕рдорд╛рдзрд╛рди рд╣рдореЗрд╢рд╛
рдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
рдЬреБрдбрд╝рдиреЗ рдпреЛрдЧреНрдп () рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╣реИред
int main ( )
{
thread t1 ( LaunchRocket ) ;
t1. detach ( ) ;
//..... 100 -
if ( t1. joinable ( ) )
{
t1. join ( ) ;
}
return 0 ;
}
рдЧрд▓рддреА # 3: рдЧрд▓рддрдлрд╣рдореА рдХрд┐ std :: рдзрд╛рдЧрд╛ :: join () рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдиреЗрдЯрд╡рд░реНрдХ I / O рдХреЗ "рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЪрд▓рдиреЗ" рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рдПрдХ рдмрдЯрди рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреА рд╣реЛрдЧреА, рдЖрджрд┐ред рдРрд╕реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, UI рд░реЗрдВрдбрд░ рдереНрд░реЗрдб) рдХреЗ рд▓рд┐рдП
рдЬреБрдбрд╝рдиреЗ () рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рдЯрдХ рд╕рдХрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, GUI рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдПрдХ рд╢реНрд░рдорд┐рдХ рдзрд╛рдЧрд╛, рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, UI рдереНрд░реЗрдб рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬ рд╕рдХрддрд╛ рд╣реИред рдпреВрдЖрдИ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЕрдкрдирд╛ рдИрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд▓реВрдк рд╣реЛрддрд╛ рд╣реИ рдЬреИрд╕реЗ: рдорд╛рдЙрд╕ рдХреЛ рд╣рд┐рд▓рд╛рдирд╛, рдХреАрдЬрд╝ рдХреЛ рджрдмрд╛рдирд╛ рдЖрджрд┐ред рдпрд╣ рд▓реВрдк рд╡рд░реНрдХрд░ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд╕рдВрджреЗрд╢ рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдмреНрд▓реЙрдХрд┐рдВрдЧ
рдЬреЙрдЗрди () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдП рдмрд┐рдирд╛ рдЙрдирдХрд╛ рдЬрд╡рд╛рдм рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, Microsoft рд╕реЗ
WinRT рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдпреЗ рдирд┐рд░реНрдгрдп рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдереЗ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рд╕рдВрднрд╡ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП "
рдЖрдзреБрдирд┐рдХ рд╕реА ++ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕реНрдЯреЛрд░ рдПрдкреНрд╕ " рдореИрдиреБрдЕрд▓ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЧрд▓рддреА # 4: рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ
рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдкрдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ
std :: ref () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдЙрдиреНрд╣реЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рддрд╣рдд, рдПрдХ рдФрд░
C ++ 11 рдЖрд░реНрдЯрд┐рдХрд▓ рдорд▓реНрдЯреАрдкрд▓реНрд░реЗрдбрд┐рдВрдЧ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреНрдпреВ рдПрдВрдб рдП - рдереНрд░реЗрдб рдореИрдиреЗрдЬрдореЗрдВрдЯ рдмреЗрд╕рд┐рдХреНрд╕ (рдбреЗрдм рд╣рд▓реНрджрд░) рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реБрдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП [рд▓рдЧрднрдЧ]ред рдЕрдиреБрд╡рд╛рджрдХ]ред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА:рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп:
#include "stdafx.h"
#include <string>
#include <thread>
#include <iostream>
#include <functional>
using namespace std ;
void ChangeCurrentMissileTarget ( string & targetCity )
{
targetCity = "Metropolis" ;
cout << " Changing The Target City To " << targetCity << endl ;
}
int main ( )
{
string targetCity = "Star City" ;
thread t1 ( ChangeCurrentMissileTarget, targetCity ) ;
t1. join ( ) ;
cout << "Current Target City is " << targetCity << endl ;
return 0 ;
}
рдЗрд╕реЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
Changing The Target City To Metropolis
Current Target City is Star City
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХрд╣реЗ рдЧрдП рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдЯрд╛рд░рдЧреЗрдЯрд┐рдЯреА рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдорд╛рди рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред
рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП std :: ref () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:
#include "stdafx.h"
#include <string>
#include <thread>
#include <iostream>
#include <functional>
using namespace std ;
void ChangeCurrentMissileTarget ( string & targetCity )
{
targetCity = "Metropolis" ;
cout << " Changing The Target City To " << targetCity << endl ;
}
int main ( )
{
string targetCity = "Star City" ;
thread t1 ( ChangeCurrentMissileTarget, std :: ref ( targetCity ) ) ;
t1. join ( ) ;
cout << "Current Target City is " << targetCity << endl ;
return 0 ;
}
рдпрд╣ рдЙрддреНрдкрд╛рджрди рд╣реЛрдЧрд╛:
Changing The Target City To Metropolis
Current Target City is Metropolis
рдирдП рдереНрд░реЗрдб рдореЗрдВ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрди рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдШреЛрд╖рд┐рдд рдФрд░ рд╢реБрд░реВ рдореЗрдВ рд▓рдХреНрд╖рд┐рдд рд▓рдХреНрд╖реНрдп рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдЧрд▓рддреА # 5: рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕) рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд░рдХреНрд╖рд╛ рди рдХрд░реЗрдВ
рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ, рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЕрдХреНрд╕рд░ рдпрд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдм рдЙрди рддрдХ рдкрд╣реБрдВрдЪ рдХреБрдЫ рддрдВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдордп рдЙрди рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рдЧреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
std :: cout рдПрдХ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рд╣реИ рдЬреЛ 6 рдереНрд░реЗрдбреНрд╕ (t1-t5 + main) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
#include "stdafx.h"
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
using namespace std ;
std :: mutex mu ;
void CallHome ( string message )
{
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
}
int main ( )
{
thread t1 ( CallHome, "Hello from Jupiter" ) ;
thread t2 ( CallHome, "Hello from Pluto" ) ;
thread t3 ( CallHome, "Hello from Moon" ) ;
CallHome ( "Hello from Main/Earth" ) ;
thread t4 ( CallHome, "Hello from Uranus" ) ;
thread t5 ( CallHome, "Hello from Neptune" ) ;
t1. join ( ) ;
t2. join ( ) ;
t3. join ( ) ;
t4. join ( ) ;
t5. join ( ) ;
return 0 ;
}
рдпрджрд┐ рд╣рдо рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рд╖реНрдХрд░реНрд╖ рдорд┐рд▓рддрд╛ рд╣реИ:
Thread 0x1000fb5c0 says Hello from Main/Earth
Thread Thread Thread 0x700005bd20000x700005b4f000 says says Thread Thread Hello from Pluto0x700005c55000Hello from Jupiter says 0x700005d5b000Hello from Moon
0x700005cd8000 says says Hello from Uranus
Hello from Neptune
рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдкрд╛рдВрдЪ рдзрд╛рдЧреЗ рдПрдХ рд╕рд╛рде рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣реЗ рд╣реИрдВред рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ
std :: mutex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрди рддрдХ рдкрд╣реБрдВрдЪ рдХреА рд░рдХреНрд╖рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдмрд╕
CallHome () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓реЗрдВ рддрд╛рдХрд┐ рд╡рд╣
std :: cout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдкрдХрдбрд╝ рд▓реЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рдореБрдХреНрдд рдХрд░ рджреЗред
void CallHome ( string message )
{
mu. lock ( ) ;
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
mu. unlock ( ) ;
}
рдЧрд▓рддреА # 6: рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд▓реЙрдХ рдЬрд╛рд░реА рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ
рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ, рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрднрд╛рдЧ рдХреЛ рдХреИрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореНрдпреВрдЯреЗрдХреНрд╕ рдкрд░ рд╕реАрдзреЗ
рд▓реЙрдХ () рдФрд░
рдЕрдирд▓реЙрдХ () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдкрд╕рдВрджреАрджрд╛ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЖрдпреЛрдЬрд┐рдд рд▓реЙрдХ рдХреЛ рджреЗрдирд╛ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рд╕рдВрд╕рд╛рдзрди рдХреА рд░рд┐рд╣рд╛рдИ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╕рднреА рдЕрдиреНрдп рдзрд╛рдЧреЗ рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рдЯрдХрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдпрджрд┐ рдЖрдк
рдХреЙрд▓рд╣реЛрдо () рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рдирд╛ рднреВрд▓ рдЧрдП, рддреЛ рд╕реНрдЯреНрд░реАрдо рдЯреА 1 рд╕реЗ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ рдорд╛рдирдХ рд╕реНрдЯреНрд░реАрдо рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдереНрд░реЗрдб рдЯреА 1 рдХреЛ рдореНрдпреВрдЯреЗрдХреНрд╕ рд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рдФрд░ рд╢реЗрд╖ рдзрд╛рдЧреЗ рдЗрд╕ рд▓реЙрдХ рдХреЗ рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред
void CallHome ( string message )
{
mu. lock ( ) ;
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
//mu.unlock();
}
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрд╕ рдХреЛрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рд╣реИ - рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛, рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдЖ:
Thread 0x700005986000 says Hello from Pluto
рдРрд╕реА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЕрдХреНрд╕рд░ рд╣реЛрддреА рд╣реИрдВ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕ рд╕реЗ рд╕реАрдзреЗ
рд▓реЙрдХ () / рдЕрдирд▓реЙрдХ () рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп,
std :: lock_guard рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬреЛ рд▓реЙрдХ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
RAII рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЬрдм
рд▓реЙрдХ_рдЧрд╛рд░реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдкреНрд░реЛрдЧреНрд░рд╛рдо
рд▓реЙрдХ_рдЧрд╛рд░реНрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред
рд╣рдо
рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП
CallHome () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ
:: lock_guard рдСрдмреНрдЬреЗрдХреНрдЯ:
void CallHome ( string message )
{
std :: lock_guard < std :: mutex > lock ( mu ) ; //
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
} // lock_guard
рдЧрд▓рддреА # 7: рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХрд╛ рдЖрдХрд╛рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдмрдбрд╝рд╛ рдХрд░реЗрдВ
рдЬрдм рдПрдХ рдзрд╛рдЧрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рдЕрдВрджрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд╕рднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рд╣реЛрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЗрдХреНрд╢рди рдореЗрдВ рдпрдерд╛рд╕рдВрднрд╡ рдХрдо рдирд┐рд░реНрджреЗрд╢ рд░рдЦрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрдбрд╝реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдХреЗ рд╕рд╛рде рдЦрд░рд╛рдм рдХреЛрдб рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
void CallHome ( string message )
{
std :: lock_guard < std :: mutex > lock ( mu ) ; // , std::cout
ReadFifyThousandRecords ( ) ;
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
} // lock_guard mu
ReadFifyThousandRecords () рд╡рд┐рдзрд┐ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд▓реЙрдХ рдХреЗ рддрд╣рдд рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдпрд╣ рд╡рд┐рдзрд┐ 10 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ 50 рд╣рдЬрд╛рд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рддреЗ рд╣реБрдП, рдЕрдиреНрдп рд╕рднреА рдзрд╛рдЧреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреВрд░реА рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХрд╛ рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЦрдВрдб рдореЗрдВ рдХреЗрд╡рд▓
std :: cout рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред
void CallHome ( string message )
{
ReadFifyThousandRecords ( ) ; // ..
std :: lock_guard < std :: mutex > lock ( mu ) ; // , std::cout
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
} // lock_guard mu
рдЧрд▓рддреА # 8: рдПрдХ рдЕрд▓рдЧ рдХреНрд░рдо рдореЗрдВ рдХрдИ рддрд╛рд▓реЗ рд▓реЗрдирд╛
рдпрд╣
рдЧрддрд┐рд░реЛрдз рдХреЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЬрд┐рд╕рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рдХрд╛рд░рдг рдЕрд╕реАрдо рд░реВрдк рд╕реЗ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
рдзрд╛рд░рд╛ 1 | рдзрд╛рд░рд╛ реи |
---|
рддрд╛рд▓рд╛ рдП | рддрд╛рд▓рд╛ рдмреА |
// ... рдХреБрдЫ рдСрдкрд░реЗрд╢рди | // ... рдХреБрдЫ рдСрдкрд░реЗрд╢рди |
рддрд╛рд▓рд╛ рдмреА | рддрд╛рд▓рд╛ рдП |
// ... рдХреБрдЫ рдЕрдиреНрдп рдСрдкрд░реЗрд╢рди | // ... рдХреБрдЫ рдЕрдиреНрдп рдСрдкрд░реЗрд╢рди |
рдЕрдирд▓реЙрдХ рдмреА | рдЕрдирд▓реЙрдХ рдХрд░реЗрдВ |
рдЕрдирд▓реЙрдХ рдХрд░реЗрдВ | рдЕрдирд▓реЙрдХ рдмреА |
рдПрдХ рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдереНрд░реЗрдб 1 рд▓реЙрдХ рдмреА рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдереНрд░реЗрдб 2 рдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рджреВрд╕рд░рд╛ рдзрд╛рдЧрд╛ рд▓реЙрдХ рдП рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рдзрд╛рдЧреЗ рджреНрд╡рд╛рд░рд╛ рдХрдмреНрдЬрд╛ рдХрд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдереНрд░реЗрдб 1 рд▓реЙрдХ A рдХреЛ рддрдм рддрдХ рд░рд┐рд▓реАрдЬрд╝ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ B рдХреЛ рд▓реЙрдХ рди рдХрд░ рджреЗ, рдЖрджрд┐ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬрдорд╛ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдЖрдкрдХреЛ
рдЧрддрд┐рд░реЛрдз рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <thread>
#include <mutex>
using namespace std ;
std :: mutex muA ;
std :: mutex muB ;
void CallHome_Th1 ( string message )
{
muA. lock ( ) ;
// -
std :: this_thread :: sleep_for ( std :: chrono :: milliseconds ( 100 ) ) ;
muB. lock ( ) ;
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
muB. unlock ( ) ;
muA. unlock ( ) ;
}
void CallHome_Th2 ( string message )
{
muB. lock ( ) ;
// -
std :: this_thread :: sleep_for ( std :: chrono :: milliseconds ( 100 ) ) ;
muA. lock ( ) ;
cout << "Thread " << this_thread :: get_id ( ) << " says " << message << endl ;
muA. unlock ( ) ;
muB. unlock ( ) ;
}
int main ( )
{
thread t1 ( CallHome_Th1, "Hello from Jupiter" ) ;
thread t2 ( CallHome_Th2, "Hello from Pluto" ) ;
t1. join ( ) ;
t2. join ( ) ;
return 0 ;
}
рдпрджрд┐ рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдк рдереНрд░реЗрдб рд╡рд┐рдВрдбреЛ рдореЗрдВ рдбреАрдмрдЧрд░ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкрд╣рд▓рд╛ рдереНрд░реЗрдб (
CallHome_Th1 () рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) mutex B рдкрд░ рд▓реЙрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬрдмрдХрд┐ рдереНрд░реЗрдб 2 (
CallHome_T2 .2 рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) mutex рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рдереНрд░реЗрдб рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВред рд╕рдлрд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛, рдЬреЛ рдЧрддрд┐рд░реЛрдз рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ!

(рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ)
рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рдХреЛрдб рдХрд╛ рдкреБрдирд░реНрдЧрдарди рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рд▓реЙрдХрд┐рдВрдЧ рд▓реЙрдХ рд╣рд░ рдмрд╛рд░ рдЙрд╕реА рдХреНрд░рдо рдореЗрдВ рд╣реЛред
рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдЕрдиреНрдп рд░рдгрдиреАрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
1. рд╕рдВрдпреБрдХреНрдд рд░реВрдк рд╕реЗ рдХрдИ рддрд╛рд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░
рдХреНрд▓рд╛рд╕ std :: scoped_lock рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
std :: scoped_lock lock { muA, muB } ;
2.
std :: timed_mutex рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕рдВрд╕рд╛рдзрди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рддрд╛рд▓рд╛ рдЬрд╛рд░реА рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
std :: timed_mutex m ;
void DoSome ( ) {
std :: chrono :: milliseconds timeout ( 100 ) ;
while ( true ) {
if ( m. try_lock_for ( timeout ) ) {
std :: cout << std :: this_thread :: get_id ( ) << ": acquire mutex successfully" << std :: endl ;
m. unlock ( ) ;
} else {
std :: cout << std :: this_thread :: get_id ( ) << ": can't acquire mutex, do something else" << std :: endl ;
}
}
}
рдЧрд▓рддреА # 9: рдПрдХ рдПрд╕рдЯреАрдбреА рд╣рдбрд╝рдкрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ :: рдореНрдпреВрдЯреЗрдХреНрд╕ рд▓реЙрдХ рджреЛ рдмрд╛рд░
рд▓реЙрдХ рдХреЛ рджреЛ рдмрд╛рд░ рд▓реЙрдХ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рдЕрдзрд┐рдХрд╛рдВрд╢ рдбрд┐рдмрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ,
LaunchRocket () рдореНрдпреВрдЯреЗрдХреНрд╕
рдХреЛ рд▓реЙрдХ
рдХрд░реЗрдЧрд╛ рдФрд░ рдлрд┐рд░
рд╕реНрдЯрд╛рд░реНрдЯрдЯреНрд░рд╕реНрдЯрд░ () рдХреЛ рдХреЙрд▓
рдХрд░реЗрдЧрд╛ ред рдЙрддреНрд╕реБрдХ рдХреНрдпрд╛ рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рдЖрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрдЪрд╛рд▓рди рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ рдпрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
std :: mutex mu ;
static int counter = 0 ;
void StartThruster ( )
{
try
{
// -
}
catch ( ... )
{
std :: lock_guard < std :: mutex > lock ( mu ) ;
std :: cout << "Launching rocket" << std :: endl ;
}
}
void LaunchRocket ( )
{
std :: lock_guard < std :: mutex > lock ( mu ) ;
counter ++ ;
StartThruster ( ) ;
}
int main ( )
{
std :: thread t1 ( LaunchRocket ) ;
t1. join ( ) ;
return 0 ;
}
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдкрд╣рд▓реЗ рдкреНрд░рд╛рдкреНрдд рддрд╛рд▓реЗ рдХреА рдкреБрдирдГ рдкреНрд░рд╛рдкреНрддрд┐ рдХреЛ рд░реЛрдХрдирд╛ рд╣реИред рдЖрдк crd solution рдХреЗ рд░реВрдк рдореЗрдВ
std :: recursive_mutex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЦрд░рд╛рдм рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЧрд▓рддреА # 10: рдЬрдм std :: рдкрд░рдорд╛рдгреБ рдкреНрд░рдХрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЬрдм рдЖрдкрдХреЛ рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдмреВрд▓рд┐рдпрди рдорд╛рди рдпрд╛ рдкреВрд░реНрдгрд╛рдВрдХ рдХрд╛рдЙрдВрдЯрд░,
рдПрд╕рдЯреАрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
: рдкрд░рдорд╛рдгреБ рдЖрдорддреМрд░ рдкрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рджреЗрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп:
int counter ;
...
mu. lock ( ) ;
counter ++ ;
mu. unlock ( ) ;
рдПрдХ рдЪрд░ рдХреЛ
std рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ
:: рдкрд░рдорд╛рдгреБ :
std :: atomic < int > counter ;
...
counter ++ ;
рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдкрд░рдорд╛рдгреБ рдХреА рд╡рд┐рд╕реНрддреГрдд рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП,
рддреБрд▓рдирд╛ рджреЗрдЦреЗрдВ
: C ++ 11 рдмрдирд╛рдо рдПрдЯреЛрдорд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рд▓реЙрдХрд▓реЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдЖрд░рдбрдмреНрд▓реНрдпреВ-рддрд╛рд▓реЗ ┬╗рдорд┐рд╕реНрдЯреЗрдХ # 11: рдлреНрд░реА рдереНрд░реЗрдбреНрд╕ рдХреЗ рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд╕реАрдзреЗ рдереНрд░реЗрдбреНрд╕ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдПрдВ рдФрд░ рдирд╖реНрдЯ рдХрд░реЗрдВ
рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдереНрд░реЗрдб рдмрдирд╛рдирд╛ рдФрд░ рдирд╖реНрдЯ рдХрд░рдирд╛ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рдЬрдмрдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд░реВрдк рд╕реЗ рдЧрд╣рди рд╕рдВрдЪрд╛рд▓рди рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдпрд╛ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдЧреЗрдо рднреМрддрд┐рдХреА рдкреНрд░рддрд┐рдкрд╛рджрдиред рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдХреНрд╕рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреВрд░реНрд╡-рдЖрд╡рдВрдЯрд┐рдд рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдПрдХ рдкреВрд▓ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрдирд╛ рдпрд╛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреВрд░реЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рднреЗрдЬрдирд╛ред
рдереНрд░реЗрдб рдкреВрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереНрд░реЗрдбрд┐рдВрдЧ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдФрд░ рдЦреБрдж рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ
рдереНрд░реЗрдб рдУрд╡рд░рд╕реНрдХреНрд░рд┐рдкреНрд╢рди (рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЬрд┐рд╕рдореЗрдВ рдереНрд░реЗрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдЙрдкрд▓рдмреНрдз рдХреЛрд░ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд▓рд┐рдП рдЦрд░реНрдЪ рд╣реЛрддрд╛ рд╣реИ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдиреБрд╡рд╛рджрдХ])ред рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдЬреАрд╡рди рдЪрдХреНрд░ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд╡реЗрджрдирд╛рдУрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рдХрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдХреЛрдб рдореЗрдВ рддрдмреНрджреАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдереНрд░реЗрдб рдкреВрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рджреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреБрд╕реНрддрдХрд╛рд▓рдп
рдЗрдВрдЯреЗрд▓ рдереНрд░реЗрдб рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдмреНрд▓реЙрдХреНрд╕ (TBB) рдФрд░
Microsoft рд╕рдорд╛рдирд╛рдВрддрд░ рдкреИрдЯрд░реНрди рд▓рд╛рдЗрдмреНрд░реЗрд░реА (PPL) рд╣реИрдВ ред
рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ 12: рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╣реИрдВрдбрд▓ рди рдХрд░реЗрдВ
рдПрдХ рдзрд╛рдЧреЗ рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рджреВрд╕рд░реЗ рдзрд╛рдЧреЗ рдореЗрдВ рд╕рдВрднрд╛рд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ред рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рд╕реЗ рдЕрд▓рдЧ рдереНрд░реЗрдб рд╢рд╛рдЦрд╛ рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рдзрд╛рдЧреЗ рд╕реЗ рдлреЗрдВрдХреЗ рдЧрдП рдХрд┐рд╕реА рдЕрдкрд╡рд╛рдж рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗ, рддреЛ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
#include "stdafx.h"
#include<iostream>
#include<thread>
#include<exception>
#include<stdexcept>
static std :: exception_ptr teptr = nullptr ;
void LaunchRocket ( )
{
throw std :: runtime_error ( "Catch me in MAIN" ) ;
}
int main ( )
{
try
{
std :: thread t1 ( LaunchRocket ) ;
t1. join ( ) ;
}
catch ( const std :: exception & ex )
{
std :: cout << "Thread exited with exception: " << ex. what ( ) << " \n " ;
}
return 0 ;
}
рдЬрдм рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЦреНрдп () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреИрдЪ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдФрд░ рдереНрд░реЗрдб рдЯреА 1 рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓ рдирд╣реАрдВ рдкрд╛рдПрдЧрд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓ C ++ 11 рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ:
std :: рдЕрдкрд╡рд╛рдж_ptr рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпреЗ рдХрджрдо рдЖрдкрдХреЛ рдЙрдард╛рдиреЗ рд╣реЛрдВрдЧреЗ:
- Std рдХрд╛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдБ :: рдЕрдкрд╡рд╛рдж_ptr рд╡рд░реНрдЧ рдХреЛ nullptr рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрджрд░ рдЬреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИ, рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ std :: current_exception () рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ :: рдЕрдкрд╡рд╛рдж_ptr рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдШреЛрд╖рд┐рдд
- рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ
- рдпрджрд┐ рдорд╛рди рд╕реЗрдЯ рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рдкрдХрдбрд╝реЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЛ рдмрд╛рд░-рдмрд╛рд░ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП std :: rethrow_exception (рдЕрдкрд╡рд╛рдж_ptr p) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВ
рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдпрд╛рдж рдХрд░рдирд╛ рдЙрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рд╛рди рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдб рдореЗрдВ рдлреЗрдВрдХреЗ рдЧрдП рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред
#include "stdafx.h"
#include<iostream>
#include<thread>
#include<exception>
#include<stdexcept>
static std :: exception_ptr globalExceptionPtr = nullptr ;
void LaunchRocket ( )
{
try
{
std :: this_thread :: sleep_for ( std :: chrono :: milliseconds ( 100 ) ) ;
throw std :: runtime_error ( "Catch me in MAIN" ) ;
}
catch ( ... )
{
//
globalExceptionPtr = std :: current_exception ( ) ;
}
}
int main ( )
{
std :: thread t1 ( LaunchRocket ) ;
t1. join ( ) ;
if ( globalExceptionPtr )
{
try
{
std :: rethrow_exception ( globalExceptionPtr ) ;
}
catch ( const std :: exception & ex )
{
std :: cout << "Thread exited with exception: " << ex. what ( ) << " \n " ;
}
}
return 0 ;
}
рдЧрд▓рддреА # 13: std :: async рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдпрджрд┐ рдЖрдкрдХреЛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддред рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк
std :: async () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдФрд░ рд▓реИрдореНрдмрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдмрд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдзрд╛рдЧреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг, рд▓рдЧрд╛рд╡ / рдЯреБрдХрдбрд╝реА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк
std :: async () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдЦреБрдж рдХреЛ рд░рд╛рд╣рдд рджреЗрддреЗ рд╣реИрдВ рдФрд░
рдЧрддрд┐рд░реЛрдз рдореЗрдВ рдЖрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рднреА рддреЗрдЬреА рд╕реЗ рдХрдо рдХрд░рддреЗ рд╣реИрдВред
Std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн
:: async рдПрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ
std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛
:: рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
ConjureMagic () рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рдЗрдВрдЯ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред рд╣рдо рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ
рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛, рдЬрдм рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреНрд░рд╡рд╛рд╣ рдореЗрдВ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдСрдкрд░реЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред
// future
std :: future asyncResult2 = std :: async ( & ConjureMagic ) ;
//... - future
// future
int v = asyncResult2. get ( ) ;
рдкрд░рд┐рдгрд╛рдо рдХреЛ рд░рдирд┐рдВрдЧ рдереНрд░реЗрдб рд╕реЗ рдХреЙрд▓рд░ рдкрд░ рд╡рд╛рдкрд╕ рд▓рд╛рдирд╛ рдЕрдзрд┐рдХ рдмреЛрдЭрд┐рд▓ рд╣реИред рджреЛ рддрд░реАрдХреЗ рд╕рдВрднрд╡ рд╣реИрдВ:
- рдЖрдЙрдЯрдкреБрдЯ рдЪрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдЙрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкрд╛рд╕ рдХрд░рдирд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдмрдЪрд╛рдПрдЧрд╛ред
- рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдлрд╝реАрд▓реНрдб рдЪрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдереНрд░реЗрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкреВрд░рд╛ рд╣реЛрддреЗ рд╣реА рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд░реНрдЯ рдЧреБрдирдерд░реЛрде рдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рд╕реНрдЯреНрд░реАрдо рдмрдирд╛рдиреЗ рдХрд╛ рдУрд╡рд░рд╣реЗрдб 14 рдмрд╛рд░ рд╣реИ рдЬреЛ рдХрд┐
рдПрд╕рд┐рдВрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред
рдиреАрдЪреЗ рдкрдВрдХреНрддрд┐:
std :: async () рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдХрд░реЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдк
std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдордЬрдмреВрдд рддрд░реНрдХ рди
рдкрд╛рдПрдВ: рд╕реАрдзреЗ
рдзрд╛рдЧрд╛ ред
рддреНрд░реБрдЯрд┐ рд╕рдВрдЦреНрдпрд╛ 14: рдпрджрд┐ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ std :: launch :: async рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ
Std :: async () рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдирд╛рдо рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдпрд╣ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ!
рджреЛ
std :: async рд░рдирдЯрд╛рдЗрдо рдиреАрддрд┐рдпрд╛рдБ:
- std :: launch :: async : рдкрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ
- std :: launch :: deferred : рдкрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди рддреБрд░рдВрдд рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓реЙрдиреНрдЪ рдореЗрдВ рджреЗрд░реА рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ () рдпрд╛ рдкреНрд░рддреАрдХреНрд╖рд╛ () рдХреЙрд▓ рдХреЛ std :: future object рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ std :: async рдХреЙрд▓ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕реНрдерд╛рди рдкрд░, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЬрдм рд╣рдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде
std :: async () рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрди рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИред
Std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рдХрдИ рдЕрдиреНрдп рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВ
: async () рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдиреАрддрд┐ рдХреЗ рд╕рд╛рде:
- рд╕реНрдерд╛рдиреАрдп рдкреНрд░рд╡рд╛рд╣ рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкрд╣реБрдБрдЪ рдХреА рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛
- рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ () рдФрд░ рдкреНрд░рддреАрдХреНрд╖рд╛ () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
- рдЬрдм рд▓реВрдкреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдПрд╕рдЯреАрдбреА рдХреА рдЙрдореНрдореАрдж рдХрд░рддреА рд╣реИ: рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдпреЗ рд▓реВрдк рдХрднреА рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдПрд╕рдЯреАрдбреА :: async рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ std :: future рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рднрд╡рд┐рд╖реНрдпред
рдЗрди рд╕рднреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП,
рд╣рдореЗрд╢рд╛ std :: async with
std :: рд▓реЙрдиреНрдЪ :: async рд▓реЙрдиреНрдЪ рдкреЙрд▓рд┐рд╕реА рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
рдРрд╕рд╛ рди рдХрд░реЗрдВ:
// myFunction std::async
auto myFuture = std :: async ( myFunction ) ;
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдХрд░реЗрдВ:
// myFunction
auto myFuture = std :: async ( std :: launch :: async , myFunction ) ;
рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрдХреЙрдЯ рдореЗрдпрд░реНрд╕ рдХреА рдкреБрд╕реНрддрдХ "рдЗрдлреЗрдХреНрдЯрд┐рд╡ рдПрдВрдб рдореЙрдбрд░реНрди рд╕реА ++" рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЧрд▓рддреА # 15: рдХреЙрд▓ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ () рдПрдХ std рдХреА рд╡рд┐рдзрд┐ :: рдХреЛрдб рдХреЛрдб рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБ рдЬрд┐рд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХреЛрдб
std рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдСрдкрд░реЗрд╢рди рдХреА
рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБред рд╣рд╛рд▓рд╛рдВрдХрд┐,
рдЬрдмрдХрд┐ рд▓реВрдк рдХреЛ рддрдм рддрдХ рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рддрдХ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, 10 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП)ред рдпрджрд┐ рдЖрдк рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рдЕрдкреНрд░рд┐рдп рджреЗрд░реА рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
#include "stdafx.h"
#include <future>
#include <iostream>
int main ( )
{
std :: future < int > myFuture = std :: async ( std :: launch :: async , [ ] ( )
{
std :: this_thread :: sleep_for ( std :: chrono :: seconds ( 10 ) ) ;
return 8 ;
} ) ;
//
while ( true )
{
//
std :: cout << "Rendering Data" << std :: endl ;
int val = myFuture. get ( ) ; // 10
// - Val
}
return 0 ;
}
рдиреЛрдЯ : рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреА рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣
std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
:: рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБ рджреВрд╕рд░реА рдмрд╛рд░, рд╣рд╛рд▓рд╛рдВрдХрд┐
std рдХреА рд╕реНрдерд┐рддрд┐
:: рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБ рд▓реВрдк рдХреЗ рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереА рдФрд░ рдЗрд╕реЗ рдкреБрдирдГ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛ред
рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рд╕реНрдЯреИрдб рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ
:: рднрд╡рд┐рд╖реНрдп рдХреА рд╡рд╕реНрддреБ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
() рд╡рд┐рдзрд┐ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП
std :: future object рд╕реЗ рдкреВрдЫрддрд╛рдЫ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
#include "stdafx.h"
#include <future>
#include <iostream>
int main ( )
{
std :: future < int > myFuture = std :: async ( std :: launch :: async , [ ] ( )
{
std :: this_thread :: sleep_for ( std :: chrono :: seconds ( 10 ) ) ;
return 8 ;
} ) ;
//
while ( true )
{
//
std :: cout << "Rendering Data" << std :: endl ;
if ( myFuture. valid ( ) )
{
int val = myFuture. get ( ) ; // 10
// - Val
}
}
return 0 ;
}
тДЦ16: , , , std::future::get()
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЯреБрдХрдбрд╝рд╛ рд╣реИ, рдЖрдкрдХреЛ рдХреНрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЙрд▓рд┐рдВрдЧ std :: future :: get () рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ ? рдпрджрд┐ рдЖрдк рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ - рдЖрдк рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╣реА рд╣реИрдВ! рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдореЗрдВ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рдЕрдкрд╡рд╛рдж рдХреЗрд╡рд▓ рддрдм рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕реНрдЯреИрдб :: рдлреНрдпреВрдЪрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдФрд░ рдпрджрд┐ рдкреНрд░рд╛рдкреНрдд () рд╡рд┐рдзрд┐ рдХреЛ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм std :: future object рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рдХреЛрд╢рд┐рд╢ рдпрд╛ рдХреИрдЪ рдмреНрд▓реЙрдХ рдореЗрдВ std :: future :: get () рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдпрд╣ рдХреИрд╕реЗ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:#include "stdafx.h"
#include <future>
#include <iostream>
int main ( )
{
std :: future < int > myFuture = std :: async ( std :: launch :: async , [ ] ( )
{
throw std :: runtime_error ( "Catch me in MAIN" ) ;
return 8 ;
} ) ;
if ( myFuture. valid ( ) )
{
int result = myFuture. get ( ) ;
}
return 0 ;
}
#include "stdafx.h"
#include <future>
#include <iostream>
int main ( )
{
std :: future < int > myFuture = std :: async ( std :: launch :: async , [ ] ( )
{
throw std :: runtime_error ( "Catch me in MAIN" ) ;
return 8 ;
} ) ;
if ( myFuture. valid ( ) )
{
try
{
int result = myFuture. get ( ) ;
}
catch ( const std :: runtime_error & e )
{
std :: cout << "Async task threw exception: " << e. what ( ) << std :: endl ;
}
}
return 0 ;
}
тДЦ17: std::async,
рдпрджреНрдпрдкрд┐ std :: async () рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдирд┐рдпрдВрддреНрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдорд▓реНрдЯреАрдкрд░реНрд╕рд░ рд╕рд┐рд╕реНрдЯрдо (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Xbox) рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдереНрд░реЗрдб рдХреЛ рдмрд╛рдВрдзрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВредрджрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ 5 рд╡реЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдзрд╛рдЧреЗ рдХреЗ рдмрдВрдзрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдореВрд▓_рд╣реИрдВрдбрд▓ () рд╕реНрдЯреИрдб :: рдереНрд░реЗрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╡рд┐рдзрд┐ , рдФрд░ рдЗрд╕реЗ Win32 API рд╕реНрдЯреНрд░реАрдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╡ рд╣реИ ред рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ Win32 рдПрдкреАрдЖрдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдИ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИрдВ рдЬреЛ std :: thread рдпрд╛ std :: async () рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ ред рдЬрдм рдХрд╛рдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <thread>
using namespace std ;
void LaunchRocket ( )
{
cout << "Launching Rocket" << endl ;
}
int main ( )
{
thread t1 ( LaunchRocket ) ;
DWORD result = :: SetThreadIdealProcessor ( t1. native_handle ( ) , 5 ) ;
t1. join ( ) ;
return 0 ;
}
std :: async (), рдпреЗ рдореВрд▓ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдлрд╝рдВрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдкрдпреБрдХреНрдд рдмрдирд╛рддрд╛ рд╣реИредрдПрдХ рд╡рд┐рдХрд▓реНрдк std :: packaged_task рдмрдирд╛рдирд╛ рдФрд░ рдереНрд░реЗрдб рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдВрдЫрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдереНрд░реЗрдб рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рд╣реИредрдЧрд▓рддреА # 18: рдХреЛрд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ "рд░рдирд┐рдВрдЧ" рдзрд╛рдЧреЗ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ
рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ, рдкреНрд░рд╡рд╛рд╣ рдХреЛ рджреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рд╡рд░реНрдЧреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: "рд░рдирд┐рдВрдЧ" рдФрд░ "рд╡реЗрдЯрд┐рдВрдЧ"редрд░рдирд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдЙрд╕ рдХрд░реНрдиреЗрд▓ рдХреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХрд╛ 100% рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рд╡реЗ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВред рдЬрдм рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рдХреЛ рдПрдХ рдХреЛрд░ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реАрдкреАрдпреВ рдЙрдкрдпреЛрдЧ рджрдХреНрд╖рддрд╛ рдбреНрд░реЙрдк рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд╣рдо рдПрдХ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рдирд┐рдВрдЧ рдереНрд░реЗрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдХреЗ рдХрд╛рд░рдг рдкреНрд░рджрд░реНрд╢рди рдЧрд┐рд░рддрд╛ рд╣реИредрд╡реЗрдЯрд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдХреЗрд╡рд▓ рдХреБрдЫ рдШрдбрд╝реА рдЪрдХреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рд╡реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд╡реЗ рд╕рд┐рд╕реНрдЯрдо рдИрд╡реЗрдВрдЯ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ I / O, рдЖрджрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХрд░реНрдиреЗрд▓ рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрдкрд▓рдмреНрдз рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдЕрдкреНрд░рдпреБрдХреНрдд рд░рд╣рддрд╛ рд╣реИред рдПрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдзрд╛рдЧрд╛ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдЕрдиреНрдп рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдПрдХ рд╡реЗрдЯрд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдПрдХ рдХреЛрд░ рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рдлрд╛рдпрджреЗрдордВрдж рд╣реИред рдХреЛрд░ рдХреЗ рдкреНрд░рддрд┐ рдХрдИ рд▓рдВрдмрд┐рдд рдереНрд░реЗрдбреНрд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрддреЛ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдХрд┐рддрдиреЗ рд░рдирд┐рдВрдЧ рдереНрд░реЗрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ? Std :: thread :: hardware_concurrency () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрдорддреМрд░ рдкрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рджреЛ рдпрд╛ рдЕрдзрд┐рдХ рддрд╛рд░реНрдХрд┐рдХ рдХреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИредрд╣рд╛рдЗрдкрд░рдЯреНрд░реЗрдбрд┐рдВрдЧ редрдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдереНрд░реЗрдб рдХреЛ рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЖрдк рд╕рднреА рд▓рдВрдмрд┐рдд рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрд░ рднреА рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдереНрд░реЗрдбреНрд╕ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрд░ рдХреА рд╢реЗрд╖ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд╡рд╛рдб-рдХреЛрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ, рд╕рднреА рд▓рдВрдмрд┐рдд рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рд╢реЗрд╖ рддреАрди рдХреЛрд░ рдХреЗ рд▓рд┐рдП, рддреАрди рдЪрд▓рдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗред рдЖрдкрдХреЗ рдереНрд░реЗрдб рд╢реЗрдбреНрдпреВрд▓рд░ рдХреА рджрдХреНрд╖рддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдкрдХреЗ рдХреБрдЫ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдереНрд░реЗрдб рд╕рдВрджрд░реНрдн рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдкреЗрдЬ рдПрдХреНрд╕реЗрд╕ рдлреЗрд▓рд┐рдпрд░ рдЖрджрд┐ рдХреЗ рдХрд╛рд░рдг), рдХрд░реНрдиреЗрд▓ рдХреЛ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЛрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдереЛрдбрд╝реЗ рдмрдбрд╝реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдереНрд░реЗрдб рдмрдирд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЗрд╕ рдорд╛рди рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПредрдЧрд▓рддреА # 19: рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдерд┐рд░ рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЕрд╕реНрдерд┐рд░ рдХреАрд╡рд░реНрдб, рдПрдХ рдЪрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рдЪрд░ рдкрд░рдорд╛рдгреБ рдпрд╛ рдереНрд░реЗрдб рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ std :: atomic рд╣реИ редрдкрд░ рдЪрд░реНрдЪрд╛ рджреЗрдЦреЗрдВ stackoverflow рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдПредрдЧрд▓рддреА # 20: рд▓реЙрдХ рдлреНрд░реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрдм рддрдХ рдХрд┐ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╡рд╢реНрдпрдХ рди рд╣реЛ
рдЬрдЯрд┐рд▓рддрд╛ рдореЗрдВ рдХреБрдЫ рд╣реИ рдЬреЛ рд╣рд░ рдЗрдВрдЬреАрдирд┐рдпрд░ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд-рддреБрд▓реНрдпрдХрд╛рд▓рди рддрдВрддреНрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓реЙрдХ-рдлреНрд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдмрдирд╛рдирд╛ рдмрд╣реБрдд рд▓реБрднрд╛рд╡рдирд╛ рд▓рдЧрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕, рд╕рд╢рд░реНрдд рдЪрд░, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдЖрджрд┐ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рд░ рдЕрдиреБрднрд╡реА C ++ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдореИрдВрдиреЗ рдПрдХ рд░рд╛рдп рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдд рдХреА рдереАред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЧреИрд░-рд▓реЙрдХрд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рд╣реИ рдЬреЛ рд╕рдмрд╕реЗ inopportune рдХреНрд╖рдг рдореЗрдВ рдмрдЧрд╝рд▓ рдореЗрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рджреБрд░реНрдШрдЯрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реНрдг рдвреЗрд░ рдбрдВрдк рдирд╣реАрдВ рд╣реИ!)редрд╕реА ++ рдореЗрдВ рдореЗрд░реЗ рдХрд░рд┐рдпрд░ рдореЗрдВ, рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕реНрдерд┐рддрд┐ рдереА рдЬрд┐рд╕рдореЗрдВ рдмрд┐рдирд╛ рддрд╛рд▓реЗ рдХреЗ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рд╕реАрдорд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд▓реЗрдирджреЗрди рдореЗрдВ 10 рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдирд╣реАрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПредрдмрд┐рдирд╛ рд░реБрдХрд╛рд╡рдЯ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреГрдкрдпрд╛ рддреАрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рджреЗрдВ:- рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рддрд╛рдХрд┐ рдЙрд╕реЗ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝реЗрд╢рди рдореИрдХреЗрдирд┐рдЬреНрдо рдХреА рдЬрд░реВрд░рдд рди рдкрдбрд╝реЗ? рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдХрдореА рд╣реИред
- рдпрджрд┐ рдЖрдкрдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдиреЗ рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХрд┐рдпрд╛ рд╣реИ? рдпрджрд┐ рд╣рд╛рдВ, рддреЛ рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрдбрд╝рдЪрдиреЛрдВ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ?
- рдХреНрдпрд╛ рдЖрдк рд▓рдВрдмрд╡рдд рдкреИрдорд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреНрд╖реИрддрд┐рдЬ рд░реВрдк рд╕реЗ рд╕реНрдХреЗрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рд╕рд╛рд░рд╛рдВрд╢ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЧреИрд░-рд▓реЙрдХрд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдЬрдм рдЖрдкрдиреЗ рдЕрдиреНрдп рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рд╣реЛред рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЙрдкрд░реЛрдХреНрдд 19 рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреБрдЫ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдмрд┐рдирд╛ рдЕрд╡рд░реЛрдз рдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╕реЗ рджреВрд░ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдПред[рд╕реЗред рдЕрдиреБрд╡рд╛рджрдХ: рдЗрд╕ рд▓реЗрдЦ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдореЗрд░реА рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП vovo4K рдХреЛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж ред]