猫史档案馆


【编程猫】很神奇的一个事情(关于多线程的数据交流问题)

用户:ftxqgfudiftxqgfudi查看:7 回复:3 评论:7 创建时间:2019-01-03T11:04:34


嗯啊大家应该都知道编程猫的ide是多线程的,因为每一个事件积木头都是当事件发生的时候同时开始的,如果不是多线程那么就会导致同时只有一个“当开始被点击”执行。

如下是两个代码片段(同一作品同一角色):

center_image

center_image

大家仔细看就知道了,这两个积木块都是当开始被点击,也就是说程序一开始就开始执行。其中我们创建了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的线程锁语法)


回复

上一页1 页 / 共 1下一页
I桔汁糖浆II桔汁糖浆I

n=-1不是理所当然的么?因为在给n赋值的时候b无论如何都是-1啊

是不是你第一个积木模块的最后一个积木,赋值的对象错了

点赞0


评论


哲学喵哲学喵

n=-1不是理所当然的么?因为在给n赋值的时候b无论如何都是-1啊

是不是你第一个积木模块的最后一个积木,赋值的对象错了

 

你两边都是 n==b啊  

 

而且其实是单线程 从上到下执行

点赞0


评论


马铃薯焗土豆马铃薯焗土豆

emotion_编程猫_点赞

点赞0


评论