2020-03-26 17:35:12 +08:00
|
|
|
|
#include <chrono>
|
2017-10-01 10:33:08 +08:00
|
|
|
|
#include <iostream>
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <thread>
|
|
|
|
|
|
|
|
|
|
#include "librf.h"
|
|
|
|
|
|
|
|
|
|
using namespace resumef;
|
2017-11-27 18:37:18 +08:00
|
|
|
|
static std::mutex cout_mutex;
|
2017-10-01 10:33:08 +08:00
|
|
|
|
|
|
|
|
|
//这是一个重度计算任务,只能单开线程来避免主线程被阻塞
|
|
|
|
|
auto async_heavy_computing_tasks(int64_t val)
|
|
|
|
|
{
|
|
|
|
|
using namespace std::chrono;
|
|
|
|
|
|
2020-02-16 12:14:25 +08:00
|
|
|
|
awaitable_t<int64_t> awaitable;
|
2017-10-01 10:33:08 +08:00
|
|
|
|
|
|
|
|
|
std::thread([val, st = awaitable._state]
|
|
|
|
|
{
|
|
|
|
|
std::this_thread::sleep_for(500ms);
|
|
|
|
|
st->set_value(val * val);
|
|
|
|
|
}).detach();
|
|
|
|
|
|
2018-03-27 00:34:31 +08:00
|
|
|
|
return awaitable.get_future();
|
2017-10-01 10:33:08 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-02-16 01:18:25 +08:00
|
|
|
|
future_t<> heavy_computing_sequential(int64_t val)
|
2017-10-01 10:33:08 +08:00
|
|
|
|
{
|
|
|
|
|
for(size_t i = 0; i < 3; ++i)
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
scoped_lock<std::mutex> __lock(cout_mutex);
|
|
|
|
|
std::cout << val << " @" << std::this_thread::get_id() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
val = co_await async_heavy_computing_tasks(val);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
scoped_lock<std::mutex> __lock(cout_mutex);
|
|
|
|
|
std::cout << val << " @" << std::this_thread::get_id() << std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-27 18:37:18 +08:00
|
|
|
|
void test_use_single_thread(int64_t val)
|
2017-10-01 10:33:08 +08:00
|
|
|
|
{
|
2020-03-31 15:30:45 +08:00
|
|
|
|
//使用local_scheduler_t来申明一个绑定到本线程的调度器 my_scheduler
|
2017-10-01 10:33:08 +08:00
|
|
|
|
//后续在本线程运行的协程,通过this_scheduler()获得my_scheduler的地址
|
|
|
|
|
//从而将这些协程的所有操作都绑定到my_scheduler里面去调度
|
|
|
|
|
//实现一个协程始终绑定到一个线程的目的
|
2020-03-31 15:30:45 +08:00
|
|
|
|
//在同一个线程里,申明多个local_scheduler_t会怎么样?
|
2017-10-01 10:33:08 +08:00
|
|
|
|
//----我也不知道
|
|
|
|
|
//如果不申明my_scheduler,则this_scheduler()获得默认主调度器的地址
|
2020-03-31 15:30:45 +08:00
|
|
|
|
local_scheduler_t my_scheduler;
|
2017-10-01 10:33:08 +08:00
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
scoped_lock<std::mutex> __lock(cout_mutex);
|
|
|
|
|
std::cout << "running in thread @" << std::this_thread::get_id() << std::endl;
|
|
|
|
|
}
|
2017-11-27 18:37:18 +08:00
|
|
|
|
go heavy_computing_sequential(val);
|
2017-10-01 10:33:08 +08:00
|
|
|
|
|
|
|
|
|
this_scheduler()->run_until_notask();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const size_t N = 2;
|
|
|
|
|
void test_use_multi_thread()
|
|
|
|
|
{
|
|
|
|
|
std::thread th_array[N];
|
|
|
|
|
for (size_t i = 0; i < N; ++i)
|
2017-11-27 18:37:18 +08:00
|
|
|
|
th_array[i] = std::thread(&test_use_single_thread, 4 + i);
|
2017-10-01 10:33:08 +08:00
|
|
|
|
|
2017-11-27 18:37:18 +08:00
|
|
|
|
test_use_single_thread(3);
|
2017-10-01 10:33:08 +08:00
|
|
|
|
|
|
|
|
|
for (auto & th : th_array)
|
|
|
|
|
th.join();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void resumable_main_multi_thread()
|
|
|
|
|
{
|
|
|
|
|
std::cout << "test_use_single_thread @" << std::this_thread::get_id() << std::endl << std::endl;
|
2017-11-27 18:37:18 +08:00
|
|
|
|
test_use_single_thread(2);
|
2017-10-01 10:33:08 +08:00
|
|
|
|
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
std::cout << "test_use_multi_thread @" << std::this_thread::get_id() << std::endl << std::endl;
|
|
|
|
|
test_use_multi_thread();
|
|
|
|
|
|
|
|
|
|
//运行主调度器里面的协程
|
|
|
|
|
//但本范例不应该有协程存在,仅演示不要忽略了主调度器
|
2020-02-15 15:20:16 +08:00
|
|
|
|
scheduler_t::g_scheduler.run_until_notask();
|
2017-10-01 10:33:08 +08:00
|
|
|
|
}
|