基于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

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