基于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_when_all.cpp 2.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <chrono>
  2. #include <iostream>
  3. #include <string>
  4. #include <conio.h>
  5. #include <thread>
  6. #include <inttypes.h>
  7. #include "librf.h"
  8. using namespace resumef;
  9. void test_when_any()
  10. {
  11. using namespace std::chrono;
  12. GO
  13. {
  14. auto vals = co_await when_any(
  15. []() ->future_t<int>
  16. {
  17. auto dt = rand() % 1000;
  18. co_await sleep_for(1ms * dt);
  19. std::cout << dt << "@a" << std::endl;
  20. return dt;
  21. }(),
  22. []() ->future_vt
  23. {
  24. auto dt = rand() % 1000;
  25. co_await sleep_for(1ms * dt);
  26. std::cout << dt << "@b" << std::endl;
  27. }(),
  28. []() ->future_vt
  29. {
  30. auto dt = rand() % 1000;
  31. co_await sleep_for(1ms * dt);
  32. std::cout << dt << "@c" << std::endl;
  33. }());
  34. if (std::get<0>(vals).has_value())
  35. std::cout << "first done!" << std::endl;
  36. else
  37. std::cout << "any done!" << std::endl;
  38. };
  39. this_scheduler()->run_until_notask();
  40. }
  41. void test_when_all()
  42. {
  43. using namespace std::chrono;
  44. auto my_sleep = [](const char * name) -> future_t<int>
  45. {
  46. auto dt = rand() % 1000;
  47. co_await sleep_for(1ms * dt);
  48. std::cout << dt << "@" << name << std::endl;
  49. return dt;
  50. };
  51. auto my_sleep_v = [](const char * name) -> future_vt
  52. {
  53. auto dt = rand() % 1000;
  54. co_await sleep_for(1ms * dt);
  55. std::cout << dt << "@" << name << std::endl;
  56. };
  57. GO
  58. {
  59. co_await when_all();
  60. std::cout << "zero!" << std::endl << std::endl;
  61. auto [a, b] = co_await when_all(my_sleep("a"), my_sleep_v("b"));
  62. b; //b is std::ignore
  63. std::cout << a << std::endl << std::endl;
  64. auto c = co_await my_sleep("c");
  65. std::cout << c << std::endl << std::endl;
  66. auto [d, e, f] = co_await when_all(my_sleep("d"), my_sleep_v("e"), my_sleep("f"));
  67. e; //e is std::ignore
  68. std::cout << d << "," << f << std::endl << std::endl;
  69. std::vector<future_t<int> > v{ my_sleep("g"), my_sleep("h"), my_sleep("i") };
  70. auto vals = co_await when_all(std::begin(v), std::end(v));
  71. std::cout << vals[0] << "," << vals[1] << "," << vals[2] << "," << std::endl << std::endl;
  72. std::cout << "all done!" << std::endl;
  73. };
  74. this_scheduler()->run_until_notask();
  75. }
  76. void resumable_main_when_all()
  77. {
  78. srand((uint32_t)time(nullptr));
  79. test_when_any();
  80. std::cout << std::endl;
  81. test_when_all();
  82. }