基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

test_async_when_all.cpp 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. vals = co_await when_any(
  16. []() ->future_t<int>
  17. {
  18. auto dt = rand() % 1000;
  19. co_await sleep_for(1ms * dt);
  20. std::cout << dt << "@a" << std::endl;
  21. return dt;
  22. }(),
  23. []() ->future_vt
  24. {
  25. auto dt = rand() % 1000;
  26. co_await sleep_for(1ms * dt);
  27. std::cout << dt << "@b" << std::endl;
  28. }(),
  29. []() ->future_vt
  30. {
  31. auto dt = rand() % 1000;
  32. co_await sleep_for(1ms * dt);
  33. std::cout << dt << "@c" << std::endl;
  34. }());
  35. if (vals.first == 0)
  36. std::cout << "first done! value is " << std::any_cast<int>(vals.second) << std::endl;
  37. else
  38. std::cout << "any done! index is " << vals.first << std::endl;
  39. co_await sleep_for(1010ms);
  40. std::cout << std::endl;
  41. auto my_sleep = [](const char * name) -> future_t<int>
  42. {
  43. auto dt = rand() % 1000;
  44. co_await sleep_for(1ms * dt);
  45. std::cout << dt << "@" << name << std::endl;
  46. return dt;
  47. };
  48. std::vector<future_t<int> > v{ my_sleep("g"), my_sleep("h"), my_sleep("i") };
  49. vals = co_await when_any(std::begin(v), std::end(v));
  50. std::cout << "any range done! index is " << vals.first << ", valus is " << std::any_cast<int>(vals.second) << std::endl;
  51. };
  52. this_scheduler()->run_until_notask();
  53. }
  54. void test_when_all()
  55. {
  56. using namespace std::chrono;
  57. auto my_sleep = [](const char * name) -> future_t<int>
  58. {
  59. auto dt = rand() % 1000;
  60. co_await sleep_for(1ms * dt);
  61. std::cout << dt << "@" << name << std::endl;
  62. return dt;
  63. };
  64. auto my_sleep_v = [](const char * name) -> future_vt
  65. {
  66. auto dt = rand() % 1000;
  67. co_await sleep_for(1ms * dt);
  68. std::cout << dt << "@" << name << std::endl;
  69. };
  70. GO
  71. {
  72. co_await when_all();
  73. std::cout << "when all: zero!" << std::endl << std::endl;
  74. auto [a, b] = co_await when_all(my_sleep("a"), my_sleep_v("b"));
  75. (void)b; //b is std::ignore
  76. std::cout << "when all:" << a << std::endl << std::endl;
  77. auto c = co_await my_sleep("c");
  78. std::cout << "when all:" << c << std::endl << std::endl;
  79. auto [d, e, f] = co_await when_all(my_sleep("d"), my_sleep_v("e"), my_sleep("f"));
  80. (void)e; //e is std::ignore
  81. std::cout << "when all:" << d << "," << f << std::endl << std::endl;
  82. std::vector<future_t<int> > v{ my_sleep("g"), my_sleep("h"), my_sleep("i") };
  83. auto vals = co_await when_all(std::begin(v), std::end(v));
  84. std::cout << "when all:" << vals[0] << "," << vals[1] << "," << vals[2] << "," << std::endl << std::endl;
  85. std::cout << "all range done!" << std::endl;
  86. };
  87. this_scheduler()->run_until_notask();
  88. }
  89. void resumable_main_when_all()
  90. {
  91. srand((uint32_t)time(nullptr));
  92. test_when_any();
  93. std::cout << std::endl;
  94. test_when_all();
  95. }