用户:
ftxqgfudi查看:7 回复:3 评论:7 创建时间:2019-01-03T11:04:34
嗯啊大家应该都知道编程猫的ide是多线程的,因为每一个事件积木头都是当事件发生的时候同时开始的,如果不是多线程那么就会导致同时只有一个“当开始被点击”执行。
如下是两个代码片段(同一作品同一角色):
大家仔细看就知道了,这两个积木块都是当开始被点击,也就是说程序一开始就开始执行。其中我们创建了n,a,b三个变量(全局,默认为0),第一个代码块,将a的值设置为n+1,此时a应该等于1(0+1=1),而等待一秒后,将n设置为b,那么n也就等于1;第二个代码块,同样,b设置为n-1,一秒之后将n设置为b。
那么运行结果会是怎么样呢?
n=-1,a=1,b=-1
为何n=-1呢?从逻辑角度讲,第一个将n增加1,第二个将n减少1,那么一加一减最后结果应该还是0哦
因为中间有个等待一秒。
编程猫的ide是多线程的,我的判断是每个代码块(以一个事件积木开头的)和其中告诉模块之外的内容是一个线程(告诉模块是另一个线程,因为告诉中的休眠不会阻塞主程序),而此时并没有设定lock.acquire()和lock.release()等线程锁,更没有用join()来阻塞住等待的线程,那么一旦程序有间歇(此处为等待1秒),那么其余线程的代码便会乘虚而入,抢占cpu空间。
此处代码可以这样理解:两个代码块分别申请线程初始化,并同时开始。第一个线程先将a赋值=1,接着是1秒的超长(对于电脑来说)的休眠,此时第二线程便会启动,而此时读取的n还是0,因为第一个线程还没有将n设置为1,所以b=-1,然后第二线程又阻塞住了(等待一秒),接着第一线程的一秒过去,将n设置为1,而此时第二个线程一秒也过去了,此时将n设置为b,也就是-1。
这个问题提醒我们:在多个事件积木下尽量不要出现同时操作同一个全局变量,并且中间造成人为阻塞的情况。
多进程则更为恐怖,他们用的根本不是一个全局变量!
(那两个看不懂的lock.XXX什么的不用管,我最近闲得没事玩多线程来着,那是py的线程锁语法)