|
线程-即一个独立运行的子程序,就叫做线程
多线程是程序员们经常会使用到的,多线程非常高效是不可否认的,我们还可以把一些占用时间长的子程序交给线程执行(后台处理)
,在特别的地方使用线程去处理还能节省系统资源 等。
多线程是这样实现这里就不说了,下面我们主要讲解 线程句柄 许可证(临界区) 互斥量 信号量控制线程数量 原子操作 及 使用多线程的主要事项
- 线程句柄: 控制线程暂停或强制结束需要用到,关闭线程句柄并不会影响线程执行,所以个人认为线程句柄若无用咋可关闭。
CloseHandle()关闭一个内核对象
- 许可证:每个进程中访问临界资源的那段代码称为临界区(许可证也称作临界区)。当某个线程进入临界区内的时候,若其他的某个线程需要访问那段资源,那么就会被排斥,不允许进入,要等到那个已经进入的线程退出临界区后,它才能进入访问,通常用作多线程中访问共享资源时的加锁,避免多线程冲突导致程序崩溃。
EnterCriticalSection() 进入临界区
LeaveCriticalSection() 离开临界区
- 互斥量:互斥量和许可证很相似,许可证只能在自我进程中互斥,而互斥量则可以跨进程互斥,也有人使用这个做禁止重复运行,但这很容易被破J,因为只要人家关闭了那个互斥量就OK.。
CreateMutex() 创建一个互斥量
OpenMutex() 打开一个互斥量
ReleaseMutex() 释放互斥量
WaitForMultipleObjects() 等待互斥量对象
- 信号量控制线程数量:这里我用最通俗的话来讲解怎么用信号量控制线程数量,信号量首先我们可以把他当做一个容器,那么我们给他指定的多少个空间(线程数),当我们启动一个线程(给信号量资源数减一),那个空间就让他少一个,我们结束一个线程那个空间就多一个(给信号量资源数加一),当空间全部没有了的话,我们此时是在给信号量资源数减一的代码处,那么它就不会减,因为没有空间了,在这时他就会阻塞在那个代码处,等待到有空间能减一时,就自动通过并减一,如此循环那么线程数始终不会超过我们设定的最大线程数——信号量的这个解释只适用于控制线程数,其实信号量并不完全是这样(详细自己百度)。
CreateSemaphore() 创建一个信号量
OpenSemaphore() 打开一个信号量
ReleaseSemaphore() 释放信号量
WaitForSingleObject() 等待信号量
- 原子操作:原子操作与普通的整数型操作的区别是 普通的整数型操作,多线程中多个线程同时访问或操作一个共享的整数型资源时,会有可能发生多个线程同时访问一个资源而造成冲突的状况,而原子操作不同,原子操作整数型资源时它会禁止别的线程访问这个资源,等待到操作完毕后则可以让别的线程访问,并且操作时不会被任何其他任务或事件所中断,也有人说这里为什么不使用临界区呢,使用临界区也是可以的,但相对来说,原子操作的速度是比临界区快一些的 等..... 。
InterlockedExchangeAdd() 原子性相加
InterlockedIncrement() 原子性自增(+1)
InterlockedDecrement() 原子性自减(-1)
InterlockedExchange() 原子性交换
- 易语言多线程的注意事项:
6.1:避免少操作外部可视化组件或进入许可证后操作,
6.2:常识,操作共享资源时需要加锁,
6.3:尽量避免使用 编码转换 配置项操作 这种命令,要使用也最好进入临界区后使用,
6.4:灵活使用易语言的自定义数据类型,当有多个共享资源时,可以换成用自定义数据类型,
6.5:少使用别人的模块,别人的模块中有什么代码都不知道,有的可能会有某些代码会影响到线程的稳定运行,
6.6:多核CPU亲和性问题,
SetProcessAffinityMask() 置CPU亲和性
6.7:关闭无用的线程句柄减少系统资源的消耗
以上纯属个人见解,如有不对请留言,O(∩_∩)O谢谢!
好了,本章到此结束! 欢迎大家关注我的博客!(Knxxt)
本文转载自:http://www.knxty.com/bk/post/4.html 作者:七彩魔云
|
评分
-
查看全部评分
|