最近写了个程序,需要使用到多线程,在折腾过程中,对一些基本的东西理解更透彻了,这篇文章主要说说易语言线程中的局部变量和全局变量以及它们与许可证的关系。
先来看看这样一个程序:
如图所示,其中的变量m是全局变量,在线程中对全局变量或者组件进行操作时,就有可能出现冲突或者出错,为什么呢?
我是这么理解的:每个线程是独立工作的,但是因为线程里有对全局变量的操作(组件也可以看成是全局变量),所以会导致一个线程在改写这个变量内容时,另外一个变量也在改写,这样就有冲突,如:
线程1:m=m+1
线程2:m=m+1
两个线程都在进行这个操作,此时全局变量m的初始值为100,那么当第一个线程读入这个数据进行计算的过程中,第二个线程也在读入这个数据进行计算了,这两次的读入数据初始值是相同的,这样就会出现什么情况呢?很明显两次计算结果相同。
多线程的难,就是对全局变量(组件、程序集变量)的操作,至于线程内部的局部变量,是不会互相影响的。如:
线程中的局部变量i,每次启动线程都是独立的,因此输出的所有的结果都是1,不管启用多少线程,线程内部的局部变量都不会互相影响。
综上所述,多线程中,会引起冲突的是对全局变量的操作,或者是对有全局变量性质的组建、程序集变量的操作。
因为对全局变量性质的变量进行操作会引发冲突,这就需要“许可区”这个概念了。
先需要创建进入许可证 ()这个命令,它会返回一个数值,子程序拿这个返回的数值进入许可区对全局变量进行操作,操作完了,再退出许可区,这样下一个线程就能进入许可区了,每次只允许一个线程进入许可区操作,这样就避免了冲突。这就相当于在多线程内部实现了单线程的操作。
如下面的代码:
字母q是程序集变量,线程在对这个变量累加时,是一个个线程进入的,所以不会冲突。所有线程结束以后,应该要删除进入许可证。
什么时候删除进入许可证呢?
因为前面在进入许可区时,是一个个线程进入的,所以在许可区内,可以设置一个全局变量计次,如果所有的线程就进入完成了,那么计次数一定会等于线程数,然后设置一个线程逻辑变量等于假。
用时钟周期事件去监控,如果线程逻辑变量等于假,那就删除进入许可证。
并且可以开始启用新的线程。
补充:后面又折腾了线程池,详情:鱼刺线程池与易语言自带多线程的对比
标签: 多线程