今天当醒老师
写在前面,因为感叹多线程的魅力,所以把鱼刺大佬的模块都写了简单通俗的例子
我觉得,所有人,包括新手,都能看懂
详细代码注释 23个例程,覆盖95%以上的类的基本使用方法
没学明白的也可以来学
没有视频,因为时间不够...今晚是挤出来的
很感谢论坛大佬们的开源,每个人应该都是不断看别人代码学习、进步的吧
可能算重复轮子...不过能把鱼刺模块抛出来,引起大家的学习动机
学完之后,换上英特尔芯片体验多线程吧...
动手操作一下吧,不然不是自己掌握的东西
目录
0A 线程池
' 新手快来看看线程池的基本例子吧
' 如果按顺序执行一个循环,界面是不是会卡死,动不了?
' 你可以在循环里面加 处理事件()
' 但是拖动窗口的时候依然会卡
' 怎么办呢?
' 开线程!
' 请看 实例【17. 线程操作】
' ...
' 好了,现在,假设你看完了,
' 如果不开线程,那么,每个任务必须等待前一个任务完成后才能开始
' 现在开了一个线程,是不是就不占用窗口绘制了,你的鼠标可以干你的事情,你的任务在后台慢慢跑
' 那么我是不是可以在后台开多个线程呢?
' 可以,请看线程池
' 假如有100个任务,但是你的服务器配置很拉,只能开4个线程
' (线程不是越多越好,一般看CPU核心数,Windows系统下,任务管理器-性能-逻辑处理器)
' 那我就创建一个管理线程的工具,它叫线程池
' 这个时候,100个任务就在后台并发执行了
' 线程池,启动
0B. 队列
' 队列。就是有一只队伍,按照队伍排队顺序,依次执行
' 鱼刺类队列是线程安全的,也就是说,多线程里面,可以直接调用
' 现在的实例是:假如有1000个任务,但是你的服务器只能开4个线程(配置很拉)(线程不是越多越好,一般看CPU核心数,Windows系统下,任务管理器-性能-逻辑处理器)
' 这些任务呢,不可以直接传进线程里面,那就用队列。
' 先把1000个任务放进队伍里面,然后让这四个线程按自己的能力去分配
0C 线程池 - 实例2
1. 临界许可1
' 临界许可第一个用法,线程排队执行
' 某种情况下,所有线程不能并发执行,必须排队执行。
' 也可以用队列,在不方便使用队列的情况下,可以用这个临界许可
2. 临界许可2
' 临界许可第二个用法,防止资源访问冲突
' 多个线程同时修改程序集变量、全局资源,需要加锁,也就是写锁。
' 这时候用临界许可,在防止资源访问冲突的情况下,临界许可范围要写得很窄,提高允许效率
' 某些情况下(访问类、或者全局),需要加读锁,有时候不加可能会导致崩溃。
3. 哈希表 快速去重、查重、查表
' 哈希表是一种结构。通俗一点,通过一个数学函数,将一个东西变成一串代码,这个运算是非常快的,而且每个东西对应的代码都不一样
' 然后通过一系列操作,可以用在查重、去重上面
' 也包括,类似数据库里面的cha询,查表
4. 定时器队列
' 顾名思义,创建多个线程,这些线程排队执行,而且是延迟执行的
5. 定时器队列实例
' 网易云用过吧,播放列表,一首歌播完,接着下一首
6. 定长队列实例 定长栈
' 通俗地讲,一个队伍里面,只能有固定数量的人
' 所有人排成一队,新的人进来了,最前面的人就得出队
' 比如说,浏览器的历史记录,最多能装5条。再多了,内存就炸了
' 这个时候,你就得限制历史记录的数量
' 那我现在创建一个定长队列
集_定长队列.创建 (5) ' 数量为5
' 定长栈
' 先进后出,最先压入的成员,地位最难动摇,最后加进去的,一不小心就丢了饭碗
7. 鱼刺类_计时
写个例子,用汇编加法和普通加法比较
8. 读写锁
' 读写锁跟临界许可类似,防止资源访问冲突
' 多个线程同时修改程序集变量、全局资源,需要加锁,也就是写锁。
' 这时候用临界许可,在防止资源访问冲突的情况下,临界许可范围要写得很窄,提高允许效率
' 某些情况下(访问类、或者全局),需要加读锁,有时候不加可能会导致崩溃。
9. 缓冲区
' 顾名思义,就是缓存,而且不能多线程用*(非线程安全)的缓存
10. 内存操作
' 内存操作,易语言的命令大部分有多次内存分配与释放
' 直接使用内存操作,加快速度
' 但你要确保内存安全hh,不能泄露,也不能读到非法内存
' 否则程序就崩
11. 内存共享
' 通俗地讲,就是两个程序之间发信息
' 用于跨进程的通信,通过内存映射,还有别的方法,论坛上开源有管道、socket。
12. 鱼刺类_时钟
' 普通定时器,跟易语言的一样
13. 事件
' 在多个线程中,事件是一种同步机制
' 让所有的线程都等待你的命令
' 这个命令可以是别的条件,不一定是你手动触发的,可以是代码触发的,比如今天下雨了才触发
' 比如多个线程可能需要等待某个初始化操作完成才能继续执行,可以使用事件来同步这些操作
14. 同步组
' 同步组与事件类似
' 在多个线程中,事件是一种同步机制
' 让所有的线程都等待你的命令
' 这个命令可以是别的条件,不一定是你手动触发的,可以是代码触发的,比如今天下雨了才触发
' 比如多个线程可能需要等待某个初始化操作完成才能继续执行,可以使用事件来同步这些操作
15. 完成端口
' 用于高性能IO操作的同步机制
' 将文件句柄、socket句柄等IO对象与之关联
' 线程可以通过完成端口来同时监控多个IO操作,而不需要为每个操作单独阻塞或轮询
16. 线程附加数据
' _附加数据 是程序集变量吧?也就是共享数据,对不对?
' 但是你看下面的例子,三个线程同时访问附加数据,得到的值都不一样
' 为什么?
' 虽然它是程序集变量,但是每个线程里面,它都有自己对应的副本,所以各个线程互不影响
17. 线程操作
' 就是创建一个线程...
' 和易语言的启动线程一样,不过功能肯定更强大
18. 信号量
' 信号量也是种同步机制
' 用来限制可以同时访问某个资源的线程数量
' 比如说,资源只有1份,但是有8个人去抢,看谁能抢到
' 那就用信号量
' 它可以跨进程
19. 原子锁
' 原子锁就是一个加了锁的共享变量
' 但是鱼刺模块只实现了整数型的
' 不过...大佬都说易语言整数型是万能的...
' 指针...
20. 什么时候不加读锁也可能会崩?
' 会导致程序崩溃的例子
' 不加读锁,可能不会出错,也不会崩
' 但是有几率出错!并且有几率崩溃!
' 如果一开始没报错,那就终止调试,再多调试几次
' 你会发现,一开始启动的时候是最容易出错的
' 可能是出错了,但是程序没崩
' 也可能是数组越界了,程序崩了
学习无价
2024/4/3 增加 [什么时候不加读锁也可能会崩?]