.NET 线程对象私有字段侵入式编程

来源:互联网 发布:ug汽车大模具编程刀路 编辑:程序博客网 时间:2024/06/06 05:01

       侵入式编程是一个很广泛的概念 它的核心概念则是侵入一个物体内部改变目标的内容与行为 比如钩子又或者注入 但这些不在我的本文所述

本文着重关注如何侵入的修改访问线程中的“Thread::m_ThreadStartArg私有字段 用于达到一些特殊目的 本质上我从不推荐乱用这类技术

但如果利用这类技术可以提高效率 我从不介意使用这类技术 如果是写框架造轮子则会在很多地方需要这类 当然有些时候知道的越少何尝不好?

        我从不觉得这技术有什么高深的 多么值得炫耀 即便我只是一个小菜鸟 这些东西好好搞几年技术 该懂的自然就懂了无外乎一个“悟”字

        那么侵入“Thread::m_ThreadStartArg”字段的好处 有很多 比如在我们这边的服务器工程内它主要用于存放一个环境部署工作字典 比如存入缓存的长连接、数据库的长连接 一个工作线程服用一个工作字段 存放在线程对象的“m_ThreadStartArg”字段内

       想想 你为什么需要不停地关闭数据库链接、打开数据库连接然后在查询?从我的角度上看去那很消耗时钟周

期 不断地“链接、握手、质问、交换凭证”花费的时钟周期你如何弥补?如果可以保证长连接为何不做 服务器开发可没有短链接数据库的 Web?

       同时我可以说它从代码层面是可以无锁的 当然这只是指在你的工作线程执行的代码 访问当前线程中部署的工作环境 但它也是有锁的指“Thread::CurrentThread”时内部会锁一下

       那么在.NET上侵入访问私有成员字段的方法 有那些?很多 我举个例子你可以通过反射的方式 也可以是通过元数据表达式编程 同样也可以通过内嵌中间代码的方式 在这个世界你会有很多种办法侵入到目标内部 它不难相反会很容易

       我喜欢内嵌中间代码与元数据表达式的方式去做 不为什么我需要效率 如果反射会更快 我也会推崇使用反射 但不论上述的方法集合 但大多底层都无法逃离反射 只是第一次会慢一些

       那么就用元数据表达式的方法吧 虽然不可能从IL指令层面 尽可能优化但效率足够高了 与“一般式代码”使用委托的效率是等若的

      

      在.NET的体系中 任何成员都是可以被反射访问的 当然任何托管方法也是都可以被dump/il的 这没有什么好可说的上面的代码只是从“Thread”的类型中获取到“m_ThreadStartArg”字段的类型引用 上面提到不论是内嵌中间代码还是元数据表达式都无法逃离反射 上面的字段类型引用就是一个典型

   

      上述的代码就比较典型是一个侵入获取m_ThreadStartArg”字段值的代码 利用元数据表达式编写 它实际上是一个函数跳板从上述的表达式中你可以看的很清楚 它只是把m_ThreadStartArg”的值压入计算堆栈在直接返回 不过这需要一些优化每次动态编译一个委托实例的效率是很慢的 对CPU的负载也绝对不低 所以必须要提供动态代码编译缓存机制 这等价于“return Thread.m_ThreadStartArg;”

        

     设置m_ThreadStartArg”字段的值实际上与获取的方法是大同小异 上面的表达式也很容易把值付给“m_ThreadStartArg”字段 本质上也是一个跳板函数 等若于“Thread.m_ThreadStartArg=obj;

0 0
原创粉丝点击