编程相关

易语言培训教程

东拉西扯

当前位置:首页 > 编程相关 > 易语言培训教程 > 正文

易语言多线程特训班

jellybean 2017-06-26 14:13:11 编程相关 169 0

分享

在线播放地址:

https://www.bilibili.com/video/BV144411L7Ys


此套教程是和精易论坛合作推出的免费视频教程,课程大纲如下


第一课:磨刀不误砍柴工

准备工具:
有道云笔记
易语言5.71
有道词典
易语言助手
或 EVA插件
课程目标:
了解多线程常用API,
了解多线程必备知识概念
多线程安全问题(操作共享资源)
第二课:栈(用数组实现栈)
栈是一种后进先出(LIFO,last in first out)的数据结构。
栈是一种特殊的线性表,是一种只允许在一端进行插入或删除操作的线性表。允许进行插入、删除操作的一端称为栈顶,另一端称为栈底。
栈顶的当前位置是动态的,当栈中没有数据元素时,称为空栈。栈的插入操作称为进栈或入栈,栈的删除操作称为退栈或出栈。
栈分为向上增长(压栈时地址增加,即递增堆栈)和向下增长(压栈时地址减小,即递减堆栈)
判断栈是否满
判断栈是否为空
入栈
出栈
获得栈顶元素


第三课:队列(数组实现队列)
队列(queue)是一种先进先出(FIFO,first in first out)的数据结构。
队列只允许在后端/尾部进行插入操作,在前端/头部进行删除操作。
利用数组按下标进行顺序存储、删除、插入元素的特点,可在数组的末尾插入元素,在数组的首部删除元素。这样可使用数组来实现队列功能。0
判断队列是否满
判断队列是否为空
入列
出列


第四课:多线程的基本概念与线程的实现
进程是资源管理的最小单位,线程是程序执行的最小单位。
每个进程有自己的数据段、代码段和堆栈段。线程通常叫做轻型的进程。它包含独立的栈和CPU寄存状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包含打开的文件、内存页面。信号标识及动态分配内存等。
因为线程和进程比起来很小,所以相对来说线程花费更少的CPU资源。
在操作系统设计上,从进程演化出线程,最主要的目的就是更好的支持多处理器,并且减少进程上下文切换的开销。
线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。一个进程至少需要一个线程作为他的指令执行体,进程管理着资源(比如CPU、内存、文件等等)。而将线程分配到某个CPU上执行。
线程按照其调度者可分为用户级线程和内核级线程两种。
用户级线程:主要解决的是上下文切换的问题,其调度过程由用户决定。(程序开发者)用户级线程要绑定内核级线程运行。
内核级线程:由内核调度机制实现
默认情况下不能保证新线程和调用线程的执行顺序(例程:赛跑)证实了线程执行顺序根据系统调度
每个进程内部的不同线程都有自己的唯一标识(ID)
线程标识只在它所属的进程环境中有效
Sleep(延时)线程告诉系统,自己在一段时间内不要被系统调度。


第五课:线程的调度和线程优先级
线程优先级相同的情况,CPU可以运行一个线程大约20ms。而在系统中的线程有不同的优先级,这将影响调度程序如何选择下一个可调度线程。系统分配CPU时,会先分配给优先级高的线程,那这样岂不是会造成优先级低的线程得不到执行吗?错了,因为大多数线程都是不可调度的。
创建一条挂起的线程
设置线程优先级
获取线程优先级
恢复线程
等待线程


第六课:终止线程和完善多线程常用的API
关闭内核对象 closehandle   如果不关闭句柄的话,可能会造成资源(比如说内核对象)泄露。
挂起线程 127次  挂起3次我们就需要恢复3次
推荐:线程函数返回
ExitThread     该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源
TerminateThread      与ExitThread 不同,ExitThread 总是撤消调用的线程,而Terminate 能够撤消任何线程。如果使用TerminateThread ,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。Microsoft故意用这种方法来实现TerminateThread 。如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值,那么其他的线程就会出现访问违规的问题。
GetExitCodeThread
了解API
switchtothread
SetThreadAffinityMask
PostThreadMessage


第七课:线程安全,线程同步与线程互斥的概念
银行取款操作   账号金额10000块钱   两个人拿着主卡和副卡同一时间去取款机取10000块钱。


第八课:互斥锁
互斥锁是用加锁的方法来控制对共享资源的访问,在同一时刻只能由一条线程拥有互斥锁,拥有互斥锁的线程,才能对共享资源进行访问,其他线程等待,直到拥有互斥锁的线程释放互斥锁为止。
创建互斥锁
加锁
释放锁
打开互斥锁
关闭句柄


第九课:信号量的基本概念和互斥
信号量从本质上来说是一个非负整数的计数器,通常来控制对共享资源的访问。
信号量可以实现线程的同步和互斥。
信号量规则:
如果当前资源计数大于0,那么信号量处于触发状态
如果当前资源计数等于0,那么信号量处于未触发状态
系统绝对不会让当前资源计数变为负数
当前资源计数绝对不会大于最大资源计数
创建信号量
打开一个信号量
释放信号量     此API函数会将lReleaseCount的值加到信号量的当前资源计数上
等待信号量    会让信号量当前资源计数-1
关闭句柄


第十课:许可证
实际情况下,等待许可证的线程,绝对不会等待超时。
创建许可证
进入许可证             会让调用线程进入等待状态   HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager   CriticalSectionTimeout
尝试进入许可证      不会让调用线程进入等待状态,根据返回值判断
退出许可证
删除许可证


第十一课:读写锁
许可证缺少读并发性
应用于多读少写的的应用程序
SRWLock锁的目的和关键段相同:对一个资源进行保护,不让其他线程访问它。但是,与关键段不同的是:SRWLock锁分为读取者线程和写入者线程。读取者线程在同一时刻可以访问共享资源,这是因为读取资源并不存在破坏资源的风险。只有当写入者线程想要对资源进行更新的时候才需要进行同步。在这种情况下:写入者线程独占对资源的访问权。
写入者线程需要独占对共享资源的访问
读取者线程可同一时刻访问共享资源
初始化读写锁
写锁
释放写锁
读锁
释放读锁

R 成功
R 成功

R 成功
W 失败

W 成功
R 失败

W 成功
W 失败


第十二课:原子锁
所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何的上下文切换。(线程安全)
InterlockedIncrement                       以原子操作的形式递增指定变量的值并存储结果。
InterlockedDecrement                      以原子操作的形式递减指定变量的值并存储结果。
InterlockedExchange                    赋值     返回赋值前的数值
InterlockedExchangeAdd              运算,   返回运算前的数值
InterlockedCompareExchange         返回运算前的数值
LONG __cdecl InterlockedCompareExchange(  __inout  LONG volatile* Destination,    __in     LONG Exchange,  __in     LONG Comparand);
Destination,参数的值和 Comparand的值进行对比,如果相等则把第二个参数Exchange值赋值给Destination,否则无操作


第十三课:改造和完善多线程模块并实战
备注:
多线程查询数据,实战了解许可证的用法
第十四课:多线程手动输入验证码

第十五课:(完结篇)



发表评论 已有 0 评论

×