Browse Source

clang的一个bug导致when_all/any代码可能编译失败。

不得已更换切换调度器的写法。
tags/v2.9.7
tearshark 4 years ago
parent
commit
a31da60a94
2 changed files with 17 additions and 5 deletions
  1. 13
    1
      librf/src/switch_scheduler.h
  2. 4
    4
      tutorial/test_async_switch_scheduler.cpp

+ 13
- 1
librf/src/switch_scheduler.h View File

scheduler_t* _scheduler; scheduler_t* _scheduler;
}; };


inline switch_scheduler_awaitor operator co_await(scheduler_t& sch)
//由于跟when_all/when_any混用的时候,在clang上编译失败:
//clang把scheduler_t判断成一个is_awaitable,且放弃选择when_all/any(scheduler_t& sch, ...)版本
//故放弃这种用法
//inline switch_scheduler_awaitor operator co_await(scheduler_t& sch) noexcept
//{
// return { &sch };
//}
inline switch_scheduler_awaitor via(scheduler_t& sch) noexcept
{ {
return { &sch }; return { &sch };
} }
inline switch_scheduler_awaitor via(scheduler_t* sch) noexcept
{
return { sch };
}

} }

+ 4
- 4
tutorial/test_async_switch_scheduler.cpp View File

std::cout << ", scheduler = " << current_scheduler(); std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl; std::cout << ", value = " << val << std::endl;


co_await *sch_in_thread;
co_await via(sch_in_thread);
val = co_await async_get_long_switch_scheduler(val); val = co_await async_get_long_switch_scheduler(val);


std::cout << "thread = " << std::this_thread::get_id(); std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler(); std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl; std::cout << ", value = " << val << std::endl;


co_await *sch_in_main;
co_await via(sch_in_main);
val = co_await async_get_long_switch_scheduler(val); val = co_await async_get_long_switch_scheduler(val);


std::cout << "thread = " << std::this_thread::get_id(); std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler(); std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl; std::cout << ", value = " << val << std::endl;


co_await *sch_in_thread;
co_await via(sch_in_thread);
val = co_await async_get_long_switch_scheduler(val); val = co_await async_get_long_switch_scheduler(val);


std::cout << "thread = " << std::this_thread::get_id(); std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler(); std::cout << ", scheduler = " << current_scheduler();
std::cout << ", value = " << val << std::endl; std::cout << ", value = " << val << std::endl;


co_await *sch_in_thread; //fake switch
co_await via(sch_in_thread); //fake switch
val = co_await async_get_long_switch_scheduler(val); val = co_await async_get_long_switch_scheduler(val);


std::cout << "thread = " << std::this_thread::get_id(); std::cout << "thread = " << std::this_thread::get_id();

Loading…
Cancel
Save