基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

test_async_cb.cpp 1.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include <chrono>
  2. #include <iostream>
  3. #include <string>
  4. #include <conio.h>
  5. #include <thread>
  6. #include "librf.h"
  7. template<class _Ctype>
  8. void callback_get_long(int64_t val, _Ctype&& cb)
  9. {
  10. using namespace std::chrono;
  11. std::thread([val, cb = std::forward<_Ctype>(cb)]
  12. {
  13. std::this_thread::sleep_for(500ms);
  14. cb(val * val);
  15. }).detach();
  16. }
  17. //这种情况下,没有生成 frame-context,因此,并没有promise_type被内嵌在frame-context里
  18. auto async_get_long(int64_t val)
  19. {
  20. resumef::awaitable_t<int64_t> st;
  21. callback_get_long(val, [st](int64_t val)
  22. {
  23. st.set_value(val);
  24. });
  25. return st.get_future();
  26. }
  27. resumef::future_t<> wait_get_long(int64_t val)
  28. {
  29. co_await async_get_long(val);
  30. }
  31. //这种情况下,会生成对应的 frame-context,一个promise_type被内嵌在frame-context里
  32. resumef::future_t<> resumable_get_long(int64_t val)
  33. {
  34. std::cout << val << std::endl;
  35. val = co_await async_get_long(val);
  36. std::cout << val << std::endl;
  37. val = co_await async_get_long(val);
  38. std::cout << val << std::endl;
  39. val = co_await async_get_long(val);
  40. std::cout << val << std::endl;
  41. }
  42. resumef::future_t<int64_t> loop_get_long(int64_t val)
  43. {
  44. std::cout << val << std::endl;
  45. for (int i = 0; i < 5; ++i)
  46. {
  47. val = co_await async_get_long(val);
  48. std::cout << val << std::endl;
  49. }
  50. co_return val;
  51. }
  52. void resumable_main_cb()
  53. {
  54. std::cout << std::this_thread::get_id() << std::endl;
  55. GO
  56. {
  57. auto val = co_await loop_get_long(2);
  58. std::cout << "GO:" << val << std::endl;
  59. };
  60. go resumable_get_long(3);
  61. resumef::this_scheduler()->run_until_notask();
  62. }