CppCoroutines icon indicating copy to clipboard operation
CppCoroutines copied to clipboard

AsyncExecutor问题

Open wandering-readily opened this issue 1 year ago • 2 comments

Exeutor.h中的execute()函数调用的std::async()捕获了AsyncExecutor的this指针,而AsyncExecutor的提前析构导致部分资源可能提前释放了,导致程序terminate; 1

我想的办法:

  1. std::shared_ptr<>延长生命周期,但是Executor创建要使用std::make_shared<>类似的函数,那么class TaskPromise<>需要显示调用该类函数创建资源Executor executor,但是promise_type类的创建没有从文章和代码中找到相关的自定义构造函数信息;

  2. 在析构函数中加入std::binary_semaphore等信号量,等待所有std::futures取完后发出析构函数继续信号,但是仍然程序terminate; 1

  3. 类似NewThreadExecutor的std::thread()啥也不管,不获取futures;反正execute()承担的最后一项工作是handle.resume(),没有完成这个工作,协程内容不会加载到函数中,那么std::async()只执行func()内容即可,程序正常起来了;

不知道我的分析对不对~ (─‿─)

wandering-readily avatar Aug 20 '24 12:08 wandering-readily

promise_type 的生命周期是运行时控制的,所以 sharedptr 不太行。其实矛盾点就是 Future 要等执行完才会析构,真实场景下还是自己做个线程池好了,别用 std::async 了。

bennyhuo avatar Aug 22 '24 02:08 bennyhuo

promise_type 的生命周期是运行时控制的,所以 sharedptr 不太行。其实矛盾点就是 Future 要等执行完才会析构,真实场景下还是自己做个线程池好了,别用 std::async 了。

我也是这么想的,实际任务应该开出几个固定线程给协程内容使用;

除了static变量和全局变量,有什么好办法能够在promise_type构造时就将线程池地址添加进去么,因为class Task需要尽量减少用户的手动操作,不能使用额外函数;线程池我需要它也能承担其它任务,例如IO; 额,我认为static变量和全局变量会影响代码可读性,也会带来模块共享的问题,即使加上namespace隔离 ~ (─‿─)

好像应该使用static变量和全局变量,这样就能保证线程池的生命周期和程序一样,不至于用户使用协程得到个非法的线程池地址

wandering-readily avatar Aug 22 '24 03:08 wandering-readily