昨天提到了PB多线程的问题,我其实一直都想写一个PB通用线程库,但一直没有找到好的方法去实现,主要的原因有几点。PB的多线程功能很少有人去深入分析过其实现机制,也没有在这方面的文档可以参考,以前我写过一篇PB的线程使用的心得,也没有完全回答出所有的疑问,今天我想解决一下这个问题。
为什么PB中使用线程功能时可能会出现程序假死的情况(死锁)?要回答这个最主要的问题还是回到刚才提到的线程库的设想中来解决。
线程库首先不能使用PBNI去实现,因为在PBNI里你没有办法与PB同步对象的状态,这可能随时会发生资源竞态的问题,所以必须使用PB内置的线程功能[SharedObject族函数],这样就引出了上面要回答的问题。
首先说说使用PB自带线程功能的好处(PB多线程功能是真多线程,有人说是用timer模拟的,这。。。。),你可以像单线程一样去使用任何代码,任何函数(包括创建不可视对象、可视对、事务等),你只要像单线程一样去使用它们就绝对不会有问题,但如果你要像使用多线程一样去使用它们那我们就来谈谈PB线程的一些限制(也可以是缺陷吧)。
多线程的一个最基本要解决的问题就是如何在线程间通讯,有很多种手段,都是为了对同一数据进行有序访问的控制手段。在PB的多线程环境中线程间的全局变量是相互独立的(隔离),所以你如果想在线程间通讯PB只提供了通过不可视对象做为桥梁,当你试图直接在线程间操作可视对象时程序会立即crash,这没什么不对本来就不应该这样做。
为什么不可视对象就可以?这相当具有迷惑性,你会看到在PB的多线程环境中线程间通过不可视对象互操作时没有
为什么PB中使用线程功能时可能会出现程序假死的情况(死锁)?要回答这个最主要的问题还是回到刚才提到的线程库的设想中来解决。
线程库首先不能使用PBNI去实现,因为在PBNI里你没有办法与PB同步对象的状态,这可能随时会发生资源竞态的问题,所以必须使用PB内置的线程功能[SharedObject族函数],这样就引出了上面要回答的问题。
首先说说使用PB自带线程功能的好处(PB多线程功能是真多线程,有人说是用timer模拟的,这。。。。),你可以像单线程一样去使用任何代码,任何函数(包括创建不可视对象、可视对、事务等),你只要像单线程一样去使用它们就绝对不会有问题,但如果你要像使用多线程一样去使用它们那我们就来谈谈PB线程的一些限制(也可以是缺陷吧)。
多线程的一个最基本要解决的问题就是如何在线程间通讯,有很多种手段,都是为了对同一数据进行有序访问的控制手段。在PB的多线程环境中线程间的全局变量是相互独立的(隔离),所以你如果想在线程间通讯PB只提供了通过不可视对象做为桥梁,当你试图直接在线程间操作可视对象时程序会立即crash,这没什么不对本来就不应该这样做。
为什么不可视对象就可以?这相当具有迷惑性,你会看到在PB的多线程环境中线程间通过不可视对象互操作时没有