基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

test_async_suspend_always.cpp 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <chrono>
  2. #include <iostream>
  3. #include <string>
  4. #include <thread>
  5. #include "librf/librf.h"
  6. using namespace librf;
  7. future_t<> test_loop_sleep(size_t _N, const char * ch)
  8. {
  9. using namespace std::chrono;
  10. for (size_t i = 0; i < _N; ++i)
  11. {
  12. co_await librf::sleep_for(100ms);
  13. std::cout << ch;
  14. }
  15. std::cout << std::endl;
  16. }
  17. future_t<> test_recursive_await()
  18. {
  19. std::cout << "A:---1" << std::endl;
  20. co_await test_loop_sleep(5, "=");
  21. std::cout << "A:---2" << std::endl;
  22. co_await test_loop_sleep(6, "=");
  23. std::cout << "A:---3" << std::endl;
  24. co_await test_loop_sleep(7, "=");
  25. std::cout << "A:---4" << std::endl;
  26. }
  27. future_t<> test_recursive_go()
  28. {
  29. std::cout << "B:---1" << std::endl;
  30. co_await test_loop_sleep(3, "+");
  31. std::cout << "B:---2" << std::endl;
  32. go test_loop_sleep(8, "*");
  33. std::cout << "B:---3" << std::endl;
  34. co_await test_loop_sleep(4, "+");
  35. std::cout << "B:---4" << std::endl;
  36. }
  37. void resumable_main_suspend_always()
  38. {
  39. std::cout << __FUNCTION__ << std::endl;
  40. go test_recursive_await();
  41. go test_recursive_go();
  42. this_scheduler()->run_until_notask();
  43. }
  44. /*
  45. resume from 0000016B8477CE00 on thread 7752
  46. resume from 0000016B847726C0 on thread 7752
  47. .resume from 0000016B847726C0 on thread 7752
  48. .resume from 0000016B847726C0 on thread 7752
  49. .resume from 0000016B847726C0 on thread 7752
  50. .resume from 0000016B847726C0 on thread 7752
  51. .
  52. resume from 0000016B8477CE00 on thread 7752
  53. resume from 0000016B847726C0 on thread 7752
  54. .resume from 0000016B847726C0 on thread 7752
  55. .resume from 0000016B847726C0 on thread 7752
  56. .resume from 0000016B847726C0 on thread 7752
  57. .resume from 0000016B847726C0 on thread 7752
  58. .resume from 0000016B847726C0 on thread 7752
  59. .
  60. resume from 0000016B8477CE00 on thread 7752
  61. resume from 0000016B847726C0 on thread 7752
  62. .resume from 0000016B847726C0 on thread 7752
  63. .resume from 0000016B847726C0 on thread 7752
  64. .resume from 0000016B847726C0 on thread 7752
  65. .resume from 0000016B847726C0 on thread 7752
  66. .resume from 0000016B847726C0 on thread 7752
  67. .resume from 0000016B847726C0 on thread 7752
  68. .
  69. resume from 0000016B8477CE00 on thread 7752
  70. 说明有四个协程对象(其中三个对象的内存被复用,表现为地址一样)
  71. test_recursive_await -> 0000016B8477CE00
  72. test_loop_sleep<5> -> 0000016B847726C0
  73. test_loop_sleep<6> -> 0000016B847726C0
  74. test_loop_sleep<7> -> 0000016B847726C0
  75. */
  76. #if LIBRF_TUTORIAL_STAND_ALONE
  77. int main()
  78. {
  79. resumable_main_suspend_always();
  80. return 0;
  81. }
  82. #endif