- 主题:deducing this是lambda coroutine lifetime issue的解决方法吗
没看太明白。capture 的问题为啥不用 shared_ptr<> ?
顺便说一下,协程不是那么简单的。capture this 的时候要特别小心。
c = [this] {
....
}
这个 c 的生命周期记得别跳出 this 之外。
【 在 allegro 的大作中提到: 】
: 如果lambda返回一个coroutine,并且这个lambda有capture,那一般会有lifetime issue。
: 当lambda被销毁后,它的capture list也没了。
: 所以当返回的coroutine被resume时候,就触发了use-after-free。
: ...................
--
FROM 110.84.120.*
cpp20 这 coroutine api 设计得好乱啊。
最好是包装一下再拿出来用。
这篇文章写得不错:
//vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/
【 在 allegro 的大作中提到: 】
: 如果lambda返回一个coroutine,并且这个lambda有capture,那一般会有lifetime issue。
: 当lambda被销毁后,它的capture list也没了。
: 所以当返回的coroutine被resume时候,就触发了use-after-free。
: ...................
--
FROM 110.84.120.*
那就用 std::enable_shared_from_this 这个工具,在捕获 this 的时候,变成 shared_ptr<> 增加一个引用。
【 在 allegro 的大作中提到: 】
: 老鱼,这个即便使用shared_ptr也逃不过use-after-free的。
: 因为"存在lambda里面的那个shared_ptr"已经被析构了,而不是说"那个shared_ptr指向的对象"已经被析构了。
: lambda coroutine的问题就在于c逃出了this的生命周期。
: ...................
--
FROM 27.152.129.*
这个 this auto self 是什么语法啊?第一次见。
C++ 跟《黑人兄弟》一样,总有没看过的一集。
【 在 ziqin 的大作中提到: 】
: 所以,我觉得不使用this auto self的情况下,正确的姿势是
: MyCoroutine my_coroutine(int a)
: {
: ...................
--
FROM 27.152.129.*
其实不会。不存在开销大得多这种说法。
c++20 实现的 stackless coroutine. 相当于在生成函数的时候,额外传入个 context 作为参数而已。和 lambda capture 变量是一样的啊。
【 在 ylh1969 的大作中提到: 】
: coroutine作为语法糖,要比普通的函数调用开销大的多。
: 在异步和并行计算方面,多核系统中,远不如多线程高效。
--
FROM 110.84.120.*