探索flutter框架开发的app在移动应用市场的潜力与挑战
597
2022-11-06
问题解决:如何管理线程私有(thread_local)的指针变量
引言
问题出现在实现项目的一个功能的时候,我需要一个thread_local的指针,因为整个项目已经差不多实现了,但在最后发现了内存泄露的问题。因为实现的是一个偏向于底层的库,且内存的使用基本都在掌握之内,所以在项目实现之初为了效率并没有使用智能指针,但在后来在这里出现了内存泄露问题。
原本代码差不多是这样:
__thread Co_Rountinue_Env* CurrentThread_CoEnv = nullptr;
这样在线程结束以后很难去把它释放掉,所以需要想一个方法做到这样,且不想大规模改动原有代码,最终的解决方案是这样的:
__thread Co_Rountinue_Env* CurrentThread_CoEnv = nullptr;thread_local std::unique_ptr
不必在意变量名,基本思路还是使用智能指针去管理内存,我们来看一个模拟的小demo:
#include
输出:
函数结束nihao函数结束nihao
这样就达到了预期。
在解决问题的过程中还发现了boost库中也有一个玩意儿可以做到这样,即boost::thread_specific_ptr,它的作用就是用于每线程存储,且会在线程结束的时候执行预先设置的回调,就类似于一个特殊的智能指针,我们来看看其如何应用:
#include
执行以下命令:
g++ XXX.cpp -pthread -lboost_system -lboost_thread./a.out
我们可以在使用时把thread_specific_ptr当做普通指针来用,因为其本身的成员函数并不多,相比与智能指针来说可谓一个天上一个地下。除去对于指针值的输出,我们可以看到其他输出都是一样的:
5函数结束nihao5函数结束nihao
对thread_specific_ptr有兴趣的朋友可以去看看其文档,链接在文末。
参考:
文档《boost::thread_specific_ptr》
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~