基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

test_async_suspend_always.cpp 2.3KB

vor 6 Jahren
vor 6 Jahren
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. 
  2. #include <chrono>
  3. #include <iostream>
  4. #include <string>
  5. #include <conio.h>
  6. #include <thread>
  7. #include "librf.h"
  8. using namespace resumef;
  9. template<size_t _N>
  10. future_vt test_loop_sleep()
  11. {
  12. using namespace std::chrono;
  13. for (size_t i = 0; i < _N; ++i)
  14. {
  15. co_await resumef::sleep_for(100ms);
  16. std::cout << ".";
  17. }
  18. std::cout << std::endl;
  19. }
  20. future_vt test_recursive_await()
  21. {
  22. std::cout << "---1" << std::endl;
  23. co_await test_loop_sleep<5>();
  24. std::cout << "---2" << std::endl;
  25. co_await test_loop_sleep<6>();
  26. std::cout << "---3" << std::endl;
  27. co_await test_loop_sleep<7>();
  28. std::cout << "---4" << std::endl;
  29. }
  30. future_vt test_recursive_go()
  31. {
  32. std::cout << "---1" << std::endl;
  33. co_await test_loop_sleep<3>();
  34. std::cout << "---2" << std::endl;
  35. go test_loop_sleep<5>();
  36. std::cout << "---3" << std::endl;
  37. co_await test_loop_sleep<4>();
  38. std::cout << "---4" << std::endl;
  39. }
  40. void resumable_main_suspend_always()
  41. {
  42. go test_recursive_await();
  43. go test_recursive_go();
  44. this_scheduler()->run_until_notask();
  45. }
  46. /*
  47. resume from 0000016B8477CE00 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. .resume from 0000016B847726C0 on thread 7752
  53. .
  54. resume from 0000016B8477CE00 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. .resume from 0000016B847726C0 on thread 7752
  61. .
  62. resume from 0000016B8477CE00 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. .resume from 0000016B847726C0 on thread 7752
  70. .
  71. resume from 0000016B8477CE00 on thread 7752
  72. 说明有四个协程对象(其中三个对象的内存被复用,表现为地址一样)
  73. test_recursive_await -> 0000016B8477CE00
  74. test_loop_sleep<5> -> 0000016B847726C0
  75. test_loop_sleep<6> -> 0000016B847726C0
  76. test_loop_sleep<7> -> 0000016B847726C0
  77. */