TTCN3新执行器系列-对线程组件PTC的理解

  TTCN3语言中组件(component)概念是很重要的,
  组件可以作为用例(testcase)执行的主线程,也可以作为函数(function)执行的子线程。
  作为子线程执行时,使用组件的start方法调用。
  start可以调用runson该组件上的所有function,包括不同参数个数和参数类型。
  我们使用C++的线程函数都知道,对函数是有要求的,不能随便一个函数都可以作为线程函数调用。
  当然,解决方法有很多,
  比较简单的是,对成员函数进行二次封装,把this作为参数传递,这样就可以很容易调用this的成员函数了。
  但这有一个问题,在一个大的TTCN3测试套中,runson的function可能有很多(成千上万),
  如果每个函数都进行额外的wrapper封装,那冗余代码是很严重的。
  为什么说是冗余呢?
  的确,start可以调用function作为子线程,但并不是所有function都会被调用。
  那这就存在一个问题了,我们不清楚那些function会作为start调用?
  来到这里,我们想到一个好方法,模板!
  我们参考了boost的bind和function实现,构造了一个模板化方式实现,真正start调用时才模板化实现,将冗余代码最大限度减低。
  为什么不直接使用boost库呢?
  我们的理由很充分,TTCN3执行器是基于脚本语言到C++然后编译的,对编译性能要求非常严格。
  如果直接使用boost库,会导致编译性能下降较大,所以采用自己模拟实现。
  另外,我们转换后的C++类是没有拷贝操作函数的
  (我们禁止拷贝和赋值操作函数,统一采用assignvalue的虚函数实现,这可以减少h文件代码量,提高编译速度。)
  bind和function的核心理念是将数据(函数指针、参数)封装成对象,然后利用仿函数方式调用。
  最终,
  bind的模拟实现是使用模板函数方式,支持最大10个参数(其实更多参数也可以,多写几个模板函数而已)。
  function的模拟实现是使用模板类方式,对应bind的实现,核心方法当然是仿函数啦!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值