基于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_multi_thread.cpp 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <chrono>
  2. #include <iostream>
  3. #include <string>
  4. #include <thread>
  5. #include "librf/librf.h"
  6. using namespace librf;
  7. static std::mutex cout_mutex;
  8. //这是一个重度计算任务,只能单开线程来避免主线程被阻塞
  9. auto async_heavy_computing_tasks(int64_t val)
  10. {
  11. using namespace std::chrono;
  12. awaitable_t<int64_t> awaitable;
  13. std::thread([val, st = awaitable._state]
  14. {
  15. std::this_thread::sleep_for(500ms);
  16. st->set_value(val * val);
  17. }).detach();
  18. return awaitable.get_future();
  19. }
  20. future_t<> heavy_computing_sequential(int64_t val)
  21. {
  22. for(size_t i = 0; i < 3; ++i)
  23. {
  24. {
  25. scoped_lock<std::mutex> __lock(cout_mutex);
  26. std::cout << val << " @" << std::this_thread::get_id() << std::endl;
  27. }
  28. val = co_await async_heavy_computing_tasks(val);
  29. }
  30. {
  31. scoped_lock<std::mutex> __lock(cout_mutex);
  32. std::cout << val << " @" << std::this_thread::get_id() << std::endl;
  33. }
  34. }
  35. void test_use_single_thread(int64_t val)
  36. {
  37. //使用local_scheduler_t来申明一个绑定到本线程的调度器 my_scheduler
  38. //后续在本线程运行的协程,通过this_scheduler()获得my_scheduler的地址
  39. //从而将这些协程的所有操作都绑定到my_scheduler里面去调度
  40. //实现一个协程始终绑定到一个线程的目的
  41. //在同一个线程里,申明多个local_scheduler_t会怎么样?
  42. //----我也不知道
  43. //如果不申明my_scheduler,则this_scheduler()获得默认主调度器的地址
  44. local_scheduler_t my_scheduler;
  45. {
  46. scoped_lock<std::mutex> __lock(cout_mutex);
  47. std::cout << "running in thread @" << std::this_thread::get_id() << std::endl;
  48. }
  49. go heavy_computing_sequential(val);
  50. this_scheduler()->run_until_notask();
  51. }
  52. const size_t N = 2;
  53. void test_use_multi_thread()
  54. {
  55. std::thread th_array[N];
  56. for (size_t i = 0; i < N; ++i)
  57. th_array[i] = std::thread(&test_use_single_thread, 4 + i);
  58. test_use_single_thread(3);
  59. for (auto & th : th_array)
  60. th.join();
  61. }
  62. void resumable_main_multi_thread()
  63. {
  64. std::cout << "test_use_single_thread @" << std::this_thread::get_id() << std::endl << std::endl;
  65. test_use_single_thread(2);
  66. std::cout << std::endl;
  67. std::cout << "test_use_multi_thread @" << std::this_thread::get_id() << std::endl << std::endl;
  68. test_use_multi_thread();
  69. //运行主调度器里面的协程
  70. //但本范例不应该有协程存在,仅演示不要忽略了主调度器
  71. scheduler_t::g_scheduler.run_until_notask();
  72. }
  73. #if LIBRF_TUTORIAL_STAND_ALONE
  74. int main()
  75. {
  76. resumable_main_multi_thread();
  77. return 0;
  78. }
  79. #endif