|
本帖最后由 吃泡面加不起蛋 于 2022-3-22 12:37 编辑
感觉这次是理清楚思路了。
先解释许可证,以挖掘机为例。
两个挖掘机同时挖一个坑的时候,不进行限制,可能会撞。可使用许可证进行限制,必须拿到许可证,才可以挖,这样就可以保证安全。
========================
理想中的许可证。
1个许可证,AB同时想挖,A挖掘机先拿到,A就可以挖坑,此时B需要等待
A放回去以后,B拿到了,B就可以挖,挖完放回去
1个许可证,A放回去以后,A又想挖,AB又开始抢,AB谁拿到是随机的,并不是一定是B
========================
多个许可证的锁死,以2个为例。
2个许可证,如果A先拿许可证1,再去拿许可证2,然后才能工作,而B先拿许可证2,再去拿许可证1,然后才能工作
这时候就可能出现A拿着许可证1等许可证2,B拿着许可证2等许可证1,许可证冲突锁死了。
通常情况下不是我们故意要锁死,一般是先调用了许可证1,又调用了另一个子程序,另一个子程序调用了许可证2,而许可证2被忽视掉了。
========================
1个许可证的特殊情况,涉及执行UI操作(UI就是界面):
UI是一条单独,特殊的线程。执行是按顺序执行的。
所以如果有一个线程A 进入许可区,操作组件,退出许可区。又有一个按钮操作,点击后 进入许可区,操作组件,退出许可区。
两个同时进行,也可能发送锁死。
分析如下:
线程A先拿住许可证,
此时刚好按钮操作,需要许可证,就在此处等待。
A继续执行,下一步操作组件,但是操作组件需要等其他组件操作完成才可以,所以这里会等按钮操作。
按钮等许可证,线程A拿着许可证等按钮,锁死了。
这种情况很少遇到,遇到后又很难找到原因,因为明面上只有一个许可证。
处理方法可以全改为线程,点击按钮,启动一个线程,在线程里进入许可证。退出许可证。
嫌麻烦的话,也可以 许可证.尝试进入,进入失败,就 处理事件(),让其他线程先执行。
线程操作UI卡死例子.e
(31.05 KB, 下载次数: 280)
|
评分
-
查看全部评分
|