-
Notifications
You must be signed in to change notification settings - Fork 105
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
关于 copp::coroutine_context_default::ptr_t 的疑问 #23
Comments
这个协程库不提供线程池实现哈,所以你可以很容易地接入到框架原有的线程模型中。
只要引用计数不为0,就不会析构。引用计数为0的时候会自动析构,你不用管的。 BTW: 建议要安全得使用这个协程库,最简单得还是直接用 cotask 哈。接口和context类似的。 |
我使用的thread_pool 是我自己实现的, int co_download(void ){
} // 这里我打印过 int main () {
} 现在就是如果不detach 我就要保留全局引用, 而且 ptr_t 的 copy constructor 好像也是 delete 的 而detach的话, 似乎我没有任何的办法 确保 copp::coroutine_context* 能否释放, 所以我在想我这种用法是否有问题. PS, 我这里没有用boost |
把co_download里的 |
我找了个实际项目中的例子。虽然场景不太一样,但是和你碰到的问题应该是类似的。 |
我试过的, 我看了代码是 LIBCOPP_UTIL_INTRUSIVE_PTR_REF_FN_DECL 这个定义的宏, 但是我这里没有报错没有 |
我看了 而且必须在for 里面 确认 detach , 现在是不报错的 void co_downlod() 我确认一下, 是否这样内存就不会有问题了, 我看到你时显式调用 ~coroutine_context_default () 了. |
对,这样没有问题。昨天手机码的,sorry没有确认接口。使用你实际使用的coroutine_context_container类型就好了(默认是coroutine_context_default)。 关于detach,这个协程库上层操作暴露的是智能指针,所以是不需要显式detach的。但是如果使用底层的coroutine_context_container接口的话,你得自己保证析构前一定会resume到执行结束,且协程执行结束前不能析构。task和task_manager会自动保证这一点。 |
谢谢啊, 现在安心了 |
`
#include <libcopp/coroutine/coroutine_context_container.h>
typedef copp::coroutine_context_default coroutine_t;
void download_other_thread(copp::coroutine_context* ctx)
{
std::this_thread::sleep_for(std::chrone::second(6));
ctx->resume();
}
int co_download(void ){
copp::coroutine_context ctx = copp::this_coroutine::get_coroutine();
thread_pool::add(download_other_thread, ctx); // 其他线程处理具体的逻辑
ctx->yield();
}
int main () {
for (int i= 0;i< 5;++i){
coroutin_t::ptr_t context = coroutine_t::create(co_download);
context->start();
// context.detach();
}
}
`
我希望是co_download 时候抛给其他线程处理,yield, 然后其他线程处理后 resume
但是这样是会抛错的, 因为 context 已经析构了
我看到 copp::this_coroutine::get_coroutine() 其实就是 context.get()
所以 context.detach() 后是可以的
但是这样疑惑就是 这个 ptr 我怎么主动 delete ? 还是说不用管?
我觉得你的框架非常好用, 就是这个疑问我一直困扰着.
不知都是不是我的使用思路有问题, 如果是的话, 上面那个需求怎么实现 ?
谢谢
The text was updated successfully, but these errors were encountered: