PB多线程的缺陷与实现机制浅析

      昨天提到了PB多线程的问题,我其实一直都想写一个PB通用线程库,但一直没有找到好的方法去实现,主要的原因有几点。PB的多线程功能很少有人去深入分析过其实现机制,也没有在这方面的文档可以参考,以前我写过一篇PB的线程使用的心得,也没有完全回答出所有的疑问,今天我想解决一下这个问题。
      为什么PB中使用线程功能时可能会出现程序假死的情况(死锁)?要回答这个最主要的问题还是回到刚才提到的线程库的设想中来解决。
      线程库首先不能使用PBNI去实现,因为在PBNI里你没有办法与PB同步对象的状态,这可能随时会发生资源竞态的问题,所以必须使用PB内置的线程功能[SharedObject族函数],这样就引出了上面要回答的问题。
      首先说说使用PB自带线程功能的好处(PB多线程功能是真多线程,有人说是用timer模拟的,这。。。。),你可以像单线程一样去使用任何代码,任何函数(包括创建不可视对象、可视对、事务等),你只要像单线程一样去使用它们就绝对不会有问题,但如果你要像使用多线程一样去使用它们那我们就来谈谈PB线程的一些限制(也可以是缺陷吧)。
      多线程的一个最基本要解决的问题就是如何在线程间通讯,有很多种手段,都是为了对同一数据进行有序访问的控制手段。在PB的多线程环境中线程间的全局变量是相互独立的(隔离),所以你如果想在线程间通讯PB只提供了通过不可视对象做为桥梁,当你试图直接在线程间操作可视对象时程序会立即crash,这没什么不对本来就不应该这样做。
      为什么不可视对象就可以?这相当具有迷惑性,你会看到在PB的多线程环境中线程间通过不可视对象互操作时没有
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
注意事项: 1、主进程传入的对象或变量不管是不是ref线程内操作传入的引用都会影响主进程的对象或变量,且对象只能是nonvisualobject类型的。 2、基础变量如long等等都不能传引用ref会运行会报错 3、SharedObjectUnregister只是把SharedObjectDirectory中的去掉,实际内存不会释放必须destroy 4、主进程不能直接访问线程中的变量和对象,可以通过处理类私有的办法处理。 5、千万注意释放线程的时候一定要把线程里面的资源释放完,不然百分百卡死。比如一个线程里面有一个timing的计时器,如果不先stop(),直接destroy,百分百卡死。如果连接数据库或者其他接口时千万注意了!!!千万要在uf_stop()(此例子中的释放预留方法)里面把所有的资源都释放干净,资源都释放干净,源都释放干净,都释放干净,释放干净,放干净,干净,净…… 大体设计思路: 1、在主进程中建立一个“任务信息类”数组,其中包含“任务线程类”,一个任务对应一个线程。 2、在主进程中建立一个“任务管理类”,负责处理任务信息类。 简单举例: 1、新建1个“任务管理类”,再新建N“任务信息类”,将“任务信息类”赋值完成加入“任务管理类”,并创建一个“任务线程类”,此时线程开始running。 2、“任务线程类”中有一个内部timing类,监控自己是否执行完成,会改标志。“任务管理类”也有一个timing监控“任务信息类”和“任务线程类”的情况,把完成的结束。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值