C++线程池实现原理
作者:网络转载 发布时间:[ 2016/5/12 11:29:44 ] 推荐标签:测试开发技术 .NET
所以实际上创建的对象是 ObjClosure1 , 依然是在源码
limonp-0.5.1/include/limonp/Closure.hpp
中可以找到 ObjClosure1 的实现,如下代码:
template <class Obj, class Funct, class Arg1>
class ObjClosure1: public ClosureInterface {
public:
ObjClosure1(Obj* p, Funct fun, Arg1 arg1) {
p_ = p;
fun_ = fun;
arg1_ = arg1;
}
virtual ~ObjClosure1() {
}
virtual void Run() {
(p_->*fun_)(arg1_);
}
private:
Obj* p_;
Funct fun_;
Arg1 arg1_;
};
真相大白
到这里真相基本上浮出水面了。 类的对象指针,成员函数指针,函数的参数,都作为 ObjClosure1 的类成员变量存储着。 然后在函数 Run() 里面再用起来。
virtual void Run() {
(p_->*fun_)(arg1_);
}
可能看到这里的时候有点不理解,这里涉及到类成员函数指针的调用。 显然因为类的成员函数是需要 this 指针的,这个写过 C++ 的应该都知道。 所以直接像C语言那样调用函数(如下),显然是不可能的,没有传入 this 指针嘛。
(*fun)(arg1_);
所以在 C++ 中,调用类的成员函数指针,是如下这样:
(p_->*fun_)(arg1_);
这样才能把 p_ 当成 this 指针传进去。
这样实现了之前的 NewClosure 将 「类,类成员函数指针,函数参数」打包成一个闭包供线程池调用的意图。
所以有了开始示例代码那种写法。
后
感觉自己写的还是很通俗易懂的,有具体代码,而且还是可一键下载运行的, 然后底层的代码实现也都解释了。 应该算是很对得起本文题目了吧。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南