рдЬрд╛рд╡рд╛ рдореЗрдВ рджреЗрд╢реА рдХреЛрд░рд╛рдЙрдЯрд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдХрдИ рдЖрдзреБрдирд┐рдХ рднрд╛рд╖рд╛рдПрдВ рднрд╛рд╖рд╛ рд╕реНрддрд░ рдкрд░ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВред рдЬрд╛рд╡рд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд╢рд╛ рд╣реИ рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЪреАрдЬреЗрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВред

C ++ 20 рдореЗрдВ, рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рд╣реИред
рдЬреЗрдПрдирдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдХреЛрд░ ++ рдореЗрдВ C ++ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЗрдП рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рджреЗрд╢реА рдХреЛрд░рд╛рдЙрдЯрд╛рдЗрди рдХреЛ рдХреНрдпрд╛ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬрдирд░реЗрдЯрд░ рдЖрдкрдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореВрд▓реНрдп рдЖрд▓рд╕реА рдФрд░ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

/* C++ code */ generator<int> generate(int count) { for (int i = 0; i < count; i++) { co_yield i; } } 

  /* Java code */ Generator<Integer> gen1 = Coroutine.yield(5); Generator<Float> gen2 = Coroutine.yield(1f, 5); Generator<Double> gen3 = Coroutine.yield(v -> v * 2, 1d, 5); for (int item : gen1) { System.out.println("yield value: " + item); } 

рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЬреЗрдирд░реЗрдЯрд░ рдЖрдкрдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореВрд▓реНрдп рдЖрд▓рд╕реА рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддреЗ рд╣реИрдВред

  /* C++ code */ async_generator<int> generate(int count) { for (int i = 0; i < count; i++) { co_await 1s; co_yield i; } } 

  /* Java code */ Generator<Integer> gen1 = Coroutine.yieldAsync(5); Generator<Float> gen2 = Coroutine.yieldAsync(1f, 5); Generator<Double> gen3 = Coroutine.yieldAsync(v -> v * 2, 1d, 5); for (int item : gen1) { System.out.println("yield value: " + item); } 

рдЯрд╛рд╕реНрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдЖрд▓рд╕реА рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рддрдм рддрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХрд╛рд░реНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рдХрд╛рд╢ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд░рдирд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1000 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВред рдФрд░ рдХреЙрд░рдЯреАрди рдХреЛ рдЬрд┐рддрдирд╛ рдЪрд╛рд╣реЗрдВ рдЙрддрдирд╛ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

  /* C++ code */ struct awaiter { bool await_ready() const { return false; } void await_resume() {} void await_suspend(std::coroutine_handle<> handler) { /* invoke java/jni code */ if (!handler.done()) { handler.resume(); } } }; co_await awaiter{}; 

рдЬрдм рдПрдХ рдзрд╛рдЧрд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк Runnable рдпрд╛ Callable рдХреЛ рдПрдХ coroutine рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

  /* Java code */ Coroutine.await(() -> { int sum = 5 + 10; }); Task<Integer> task = Coroutine.await(() -> { int sum = 5 + 10; return sum; }); 

рдЯрд╛рдЗрдорд░ рдЖрд╡рд╢реНрдпрдХ рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рд╡рд░реНрддрдорд╛рди рдХрд╛рд░реНрдп рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред

  auto operator co_await(const std::chrono::system_clock::duration& duration) { return timer{duration}; } co_await 10ms; 

Thread.sleep () рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

  Coroutine.await(10, TimeUnit.MILLISECONDS); 

рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо, рдиреЗрдЯрд╡рд░реНрдХ рдЗрддреНрдпрд╛рджрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЙрди-рдмреНрд▓реЙрдХрд┐рдВрдЧ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд░рдЖрдЙрдЯ рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрд░рдЯрд╛рдЗрдиреНрд╕ рд▓реЗрдЦрди рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдП рдмрд┐рдирд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдорд╡реАрдПрд╕рд╕реА, рдХреНрд▓реИрдВрдЧ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЛрд░рдЯрд╛рдЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬреАрд╕реАрд╕реА рдХреЗрд╡рд▓ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╣реИред

рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ github: рдХреЛрдб рдкрд░ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

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


All Articles