详解易语言线程同步

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

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

创建许可区:

创建并返回一个进入许可证数值,此许可证值用作进入程序中的指定许可代码区,以避免多线程冲突。成功返回非零整数值,失败返回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

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

(0)

相关推荐

  • 详解易语言线程同步

    在易语言官方多线程支持库中提供线程同步的方法是用许可区. 加入许可区之后可以防止多个线程同时访问公用变量是发生冲突.加入许可区的代码同时只能有一个线程访问,避免冲突. 创建许可区: 创建并返回一个进入许可证数值,此许可证值用作进入程序中的指定许可代码区,以避免多线程冲突.成功返回非零整数值,失败返回0.所创建的许可证在不再使用后,必须使用"删除进入许可证"命令将其删除.本命令为初级命令. 删除进入许可证: 删除由"创建进入许可证"命令所创建返回的进入许可证.成功返回

  • 详解易语言的程序的输入方法概念

    为了便于输入程序,易语言内置四种名称输入法:首拼.全拼.双拼.英文.三种拼音输入法均支持南方音及多音字.首拼输入法及全拼输入法在系统中被合并为"首拼及全拼输入法",系统自动判别所输入的拼音是首拼方式还是全拼方式.双拼输入法的编码规则与 Windows 系统所提供的双拼输入法一致.例如:欲输入"取整 (1.23)"语句,各种输入法的输入文本为: ・ 首拼及全拼输入法: qz(1.23) 或者 quzheng(1.23) ・ 双拼输入法: quvg(1.23) ・ 英文

  • 详解OpenMP的线程同步机制

    目录 前言 自定义线程之间的同步 barrier 定义临界区 critical 深入理解 barrier master construct single construct ordered construct OpenMP 中的线程同步机制 Sections 使用 nowait Single 使用 nowait For 使用 nowait 总结 前言 在本篇文章当中主要给大家介绍 OpenMP 当中线程的同步和互斥机制,在 OpenMP 当中主要有三种不同的线程之间的互斥方式: 使用 criti

  • 详解易语言字符命令

    易语言字符命令,这个命令比较少见,但是有用,我教大家操作. 1.易语言新建一个windows窗口 点击进入代码编辑区 具体看如何用易语言编写自己第一个程序? 2.我们输入 这个命令 字符() 3.展开这个字符命令 我们发现只有一个参数 4.这个参数比较少见,字节型它的取值范围为0~255 我们输入100看看 5.运用调试输出这个函数,具体看易语言调试输出函数实例详解 我们输入调试输出 (字符 (100)) 6.结果为 d 这个需要对照 ASCII表看看

  • 详解易语言的钩子(钩子HOOK与APIHOOK区别)

    在本篇内容里我们给大家详细分析了易语言中间的钩子概念以及HOOK与APIHOOK区别 钩子 原英文名称 Hook ,钩子的意思是指拦截或截获.作用就是拦截程序中交互的数据,先经过我们预定的钩子处理接口程序,处理过后,再交还给原处理程序,或者干脆阻止,吃掉这些数据,让原处理程序什么也得不到. 钩子原来是Windows操作系统常用来检查系统与程序间通信的一些数据是否到达目标时用的,为不传之密,后来随着一些高手们的研究,逐渐的发现了这些秘密的技术并且公布了出来.同时还有更多的人在掌握了这些技术后,用在

  • 详解易语言启动多线程

    用易语言写多线程应用要么使用多线程相关的api,支持库或模块,其实那些支持库或模块也都是封装的api,但是要比api使用方便. 总体来说易语言官方的多线程支持库要比一些杂七杂八的模块好多了. 支持库勾选上之后就可以使用易语言的多线程支持库了. 首先看用易语言多线程支持库创建线程的命令:启动线程: 命令名:启动线程 创建并启动一条线程,可重复使用以创建多条线程,成功返回真,失败返回假. 参数 数据类型 说明   参数<1>的名称为"欲执行的子程序" 子程序指针(SubPtr)

  • 详解易语言中的数据类型

    各种数据存放在磁盘或内存中都有其不同的存放格式,因此就存在不同的数据类型.了解各种数据的特性,对编程开发来说是十分重要. 程序中经常会进行一些运算,易语言中的运算都要使用运算符进行识别处理,并通过运算表达式来完成运算操作.程序中对各数据之间的关系的描述也要通过运算符. 1.易语言的数据类型 一个程序内部应包括两个方面的内容:1.数据的描述.2.操作步骤,即对程序动作的描述. 数据是程序操作的对象,操作的结果会改变数据的内容.打个比方:要做一道菜,做菜前先选择烹饪的原材料(即对数据进行描述),然后

  • 详解易语言变量用法和原理

    易语言是一款可视全中文的编程语言,由于他的简单易用,深受国人喜欢,下面我来为大家介绍易语言变量的用法. 易语言变量,就像是数学中设x一样,顾名思义它是不定值的,它分为局部变量,全局变量,和程序集变量,下面我为用一个程序来向大家介绍这3种变量的区别. 打开易语言,新建一个windows窗口程序,将按钮按下图所示排列. 点击插入,选择窗口,插入一个新的窗口,点击按钮1,写入代码入下图所示, 点击窗口程序集,回车,添加一个程序集变量,命名为c,类型为文本型. 点击插入,分别添加全局变量,命名为q,类型

  • 详解易语言写内存整数型

    本篇文章主要介绍如何使用编程软件"易语言"做到修改指定进程的指定内存地址中的整数型数据. 1.启动"易语言". 2.选择"菜单栏"中的"f.程序",再在弹出的列表中选择"N.新建". 3.在弹出的标题为"新建:"的窗口中选择"Windows窗口程序",再点击标题为"确定(o)"的按钮. 4.在背景为灰色的,且标题为""(空的文本

  • 详解易语言常量用法

    易语言常量用法,我用实例讲解,下面一步步操作,大家学懂了,给我投一票,谢谢! 1.易语言新建一个windows窗口点击常量表进入 2.ctrl+N 就会增加一列 如图 3.我们设置常量 分别在相应位置输入数据  如图 4.我们双击 新建的窗口 进入代码编辑区 输入_启动窗口.标题=#常量1 5.这里介绍下 常量的用法 就是常量名前面加上# 看图 这样就把它的值使用了 6.我们运行看看结果 看图 标题改变成了我们设置的常量

随机推荐