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