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

librf.cpp 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include "librf.h"
  2. #include <experimental/resumable>
  3. #include <experimental/generator>
  4. #include <optional>
  5. extern void resumable_main_yield_return();
  6. extern void resumable_main_timer();
  7. extern void resumable_main_suspend_always();
  8. extern void resumable_main_sleep();
  9. extern void resumable_main_routine();
  10. extern void resumable_main_resumable();
  11. extern void resumable_main_mutex();
  12. extern void resumable_main_exception();
  13. extern void resumable_main_event();
  14. extern void resumable_main_event_timeout();
  15. extern void resumable_main_dynamic_go();
  16. extern void resumable_main_channel();
  17. extern void resumable_main_cb();
  18. extern void resumable_main_modern_cb();
  19. extern void resumable_main_multi_thread();
  20. extern void resumable_main_channel_mult_thread();
  21. extern void resumable_main_when_all();
  22. extern void resumable_main_benchmark_mem();
  23. extern void resumable_main_benchmark_asio_server();
  24. extern void resumable_main_benchmark_asio_client(intptr_t nNum);
  25. void async_get_long(int64_t val, std::function<void(int64_t)> cb)
  26. {
  27. using namespace std::chrono;
  28. std::thread([val, cb = std::move(cb)]
  29. {
  30. std::this_thread::sleep_for(10s);
  31. cb(val * val);
  32. }).detach();
  33. }
  34. //这种情况下,没有生成 frame-context,因此,并没有promise_type被内嵌在frame-context里
  35. resumef::future_t<int64_t> co_get_long(int64_t val)
  36. {
  37. resumef::awaitable_t<int64_t > st;
  38. std::cout << "co_get_long@1" << std::endl;
  39. async_get_long(val, [st](int64_t value)
  40. {
  41. std::cout << "co_get_long@2" << std::endl;
  42. st.set_value(value);
  43. });
  44. std::cout << "co_get_long@3" << std::endl;
  45. return st.get_future();
  46. }
  47. //这种情况下,会生成对应的 frame-context,一个promise_type被内嵌在frame-context里
  48. resumef::future_t<> test_librf2()
  49. {
  50. auto f = co_await co_get_long(2);
  51. std::cout << f << std::endl;
  52. }
  53. int main(int argc, const char* argv[])
  54. {
  55. resumable_main_cb();
  56. /*
  57. resumable_main_resumable();
  58. resumable_main_benchmark_mem();
  59. if (argc > 1)
  60. resumable_main_benchmark_asio_client(atoi(argv[1]));
  61. else
  62. resumable_main_benchmark_asio_server();
  63. resumable_main_when_all();
  64. resumable_main_multi_thread();
  65. resumable_main_yield_return();
  66. resumable_main_timer();
  67. resumable_main_suspend_always();
  68. resumable_main_sleep();
  69. resumable_main_routine();
  70. resumable_main_resumable();
  71. resumable_main_mutex();
  72. resumable_main_event();
  73. resumable_main_event_timeout();
  74. resumable_main_dynamic_go();
  75. resumable_main_channel();
  76. resumable_main_cb();
  77. resumable_main_exception();
  78. */
  79. return 0;
  80. }