Kaynağa Gözat

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

不得已更换切换调度器的写法。
tags/v2.9.7
tearshark 4 yıl önce
ebeveyn
işleme
a31da60a94

+ 13
- 1
librf/src/switch_scheduler.h Dosyayı Görüntüle

@@ -33,8 +33,20 @@ RESUMEF_NS
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 };
}
inline switch_scheduler_awaitor via(scheduler_t* sch) noexcept
{
return { sch };
}

}

+ 4
- 4
tutorial/test_async_switch_scheduler.cpp Dosyayı Görüntüle

@@ -59,28 +59,28 @@ static future_t<> resumable_get_long_switch_scheduler(int64_t val, channel_t<boo
std::cout << ", scheduler = " << current_scheduler();
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);

std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler();
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);

std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler();
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);

std::cout << "thread = " << std::this_thread::get_id();
std::cout << ", scheduler = " << current_scheduler();
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);

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

Loading…
İptal
Kaydet