欢迎来到代码驿站!

当前位置:首页 >

详解易语言线程同步

时间:2021-07-01 08:50:09|栏目:|点击:

在易语言官方多线程支持库中提供线程同步的方法是用许可区。

加入许可区之后可以防止多个线程同时访问公用变量是发生冲突。加入许可区的代码同时只能有一个线程访问,避免冲突。

创建许可区:

创建并返回一个进入许可证数值,此许可证值用作进入程序中的指定许可代码区,以避免多线程冲突。成功返回非零整数值,失败返回0。所创建的许可证在不再使用后,必须使用“删除进入许可证”命令将其删除。本命令为初级命令。

删除进入许可证:

删除由“创建进入许可证”命令所创建返回的进入许可证。成功返回真,失败返回假。本命令为初级命令。

参数 数据类型 说明
进入许可证 “整数型(int) 本参数应提供由“创建进入许可证”命令所创建并返回的数值。

进入许可区: 根据已经创建的许可证进入指定许可代码区,在此线程未退出之前,其它线程如要通过同一个进入许可证进入该许可代码区则必须先等待此线程退出许可代码区,从而保证了指定许可代码区在任何时候都只能有一条线程进入并执行。本命令为初级命令。

参数 数据类型 说明
进入许可证 整数型(int) 本参数应提供由“创建进入许可证”命令所创建并返回的数值。

.版本 2
.支持库 EThread

.程序集 窗口程序集1
.程序集变量 线程句柄, 整数型, , "10"
.程序集变量 num, 整数型

.子程序 __启动窗口_创建完毕
.局部变量 i, 整数型

i = 1
num = 10
.判断循环首 (i ≤ 10)
  启动线程 (&子程序1, , 线程句柄 )
  启动线程 (&子程序2, , 线程句柄 [i + 1])
  关闭线程句柄 (线程句柄 )
  关闭线程句柄 (线程句柄 [i + 1])
  i = i + 2
.判断循环尾 ()


.子程序 子程序1

num = num - 1
输出调试文本 (num)

.子程序 子程序2

num = num - 1
输出调试文本 (num)

调试输出结果:

* 8
* 9
* 7
* 6
* 5
* 4
* 3
* 2
* 1
在执行一次:
* 8
* 7
* 9
* 6
* 5
* 4
* 3
* 2
* 1
* 0

我们可以明显的发现问题,,虽然最终是把num减到了0,但是结果完全是乱的。

利用许可证解决上面的问题:

.版本 2
.支持库 EThread

.程序集 窗口程序集1
.程序集变量 线程句柄, 整数型, , "10"
.程序集变量 num, 整数型
.程序集变量 许可证, 整数型

.子程序 __启动窗口_创建完毕
.局部变量 i, 整数型

许可证 = 创建进入许可证 ()

i = 1
num = 10
.判断循环首 (i ≤ 10)
  启动线程 (&子程序1, , 线程句柄 )
  启动线程 (&子程序2, , 线程句柄 [i + 1])
  关闭线程句柄 (线程句柄 )
  关闭线程句柄 (线程句柄 [i + 1])
  i = i + 2
.判断循环尾 ()

.如果真 (num = 0)
  删除进入许可证 (许可证)
.如果真结束


.子程序 子程序1

进入许可区 (许可证)
num = num - 1
退出许可区 (许可证)
输出调试文本 (num)

.子程序 子程序2

进入许可区 (许可证)
num = num - 1
退出许可区 (许可证)
输出调试文本 (num)

输出结果:

* 9
* 8
* 7
* 6
* 5
* 4
* 3
* 2
* 1
* 0

用了许可证之后每次都是这样的稳定结果。

上一篇:微信小程序里使用SVG矢量图标方法详解

栏    目:

下一篇:docker 容器上编译 go 程序提示找不到文件问题

本文标题:详解易语言线程同步

本文地址:http://www.codeinn.net/misctech/150639.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有