基于C++ Coroutines提案 ‘Stackless Resumable Functions’编写的协程库
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

test_async_cb.cpp 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. 
  2. #include <chrono>
  3. #include <iostream>
  4. #include <string>
  5. #include <conio.h>
  6. #include <thread>
  7. #include "librf.h"
  8. auto async_get_long(int64_t val)
  9. {
  10. using namespace std::chrono;
  11. resumef::promise_t<int64_t> awaitable;
  12. std::thread([val, st = awaitable._state]
  13. {
  14. std::this_thread::sleep_for(500ms);
  15. st->set_value(val * val);
  16. }).detach();
  17. return awaitable.get_future();
  18. }
  19. resumef::future_vt resumable_get_long(int64_t val)
  20. {
  21. std::cout << val << std::endl;
  22. val = co_await async_get_long(val);
  23. std::cout << val << std::endl;
  24. val = co_await async_get_long(val);
  25. std::cout << val << std::endl;
  26. val = co_await async_get_long(val);
  27. std::cout << val << std::endl;
  28. }
  29. resumef::future_t<int64_t> loop_get_long(int64_t val)
  30. {
  31. std::cout << val << std::endl;
  32. for (int i = 0; i < 5; ++i)
  33. {
  34. val = co_await async_get_long(val);
  35. std::cout << val << std::endl;
  36. }
  37. return val;
  38. }
  39. void resumable_main_cb()
  40. {
  41. std::cout << std::this_thread::get_id() << std::endl;
  42. go []()->resumef::future_vt
  43. {
  44. auto val = co_await loop_get_long(2);
  45. std::cout << val << std::endl;
  46. };
  47. //resumef::this_scheduler()->run_until_notask();
  48. go resumable_get_long(3);
  49. resumef::this_scheduler()->run_until_notask();
  50. }