易语言-初识多线程

 

程序是如何执行的

什么是进程:

程序在系统当中执行的时候首先会创建一个进程,进程就是系统进行资源分配和调度的一个基本单位。

同一个进程下的所以数据都是可以被共享使用的。

什么是线程:

线程是cpu的执行单位,所有的代码都是在线程中被执行的,一个进程中一定会有一个线程。

进程里面是没有任何代码的,只是相当于管理这些线程的总容器,cpu在执行指令的时候都是以线程的方式去执行的,就是表示所有的代码都是在线程中被cpu执行的。

什么是主线程:

主线程是由系统在进程启动时自动创建的。

在窗口程序中,主线程就是窗口的UI线程(也就是窗口界面)。

主线程跟进程是一体的,当主线程退出或销毁之后这个进程也就随之结束了。

如何创建线程

程序启动后会有一个主线程,这个线程不归我们管,我们只管创建自己需要的线程即可。

使用到的命令:多线程支持库中的启动线程命令。

1
2
3
4
说明:创建并启动一条线程,可重复使用以创建多条线程,成功返回真,失败返回假。
第一个参数:欲执行的子程序。子程序指针。本参数提供创建线程时欲启动的子程序。
第二个参数:参数数据。整数型。本参数提供线程被启动时传递到欲启动子程序的整数数据。如果本参数未被省略,此时被启动子程序必须接收一个整数型参数,否则将出错。
第三个参数:线程句柄。整数型变量。如果提供了本参数,将向参数变量写入线程句柄(通过参考的方式将线程句柄写进去),请在适当的时机关闭该句柄。如果不提供本参数接收线程句柄,内部将自动处理线程句柄(就是自动将这个线程句柄关闭掉)。

线程可以说就是子程序,子程序取指针的方式非常简单就是&+子程序名。

因为线程执行完后马上就会被释放(也就是销毁),如果想要通过任务管理器去查看线程数的话,可以将线程里面加一个延时命令,这样线程就不会马上结束了。

启动线程后运行内存会增加一些,因为线程当中会存储一些和线程有关的结构信息,所以会占用一点内存。

线程是有启动上限的,超过内存的时候就不可以在启动了,因为内存不够用了无法启动,所以说线程也是不可以无限制启动的。

注:多个线程可以同时启用一个子程序,即一个线程子程序可以被启动很多次的。

创建线程的第二个参数-参数数据

创建线程的第二个参数是可以传递一个整数型的数据的。

可以通过这个参数给线程传递一些需要用到的数据。

注:只能传递整数型参数,如果想要传递文本、字节集或其它类型可以将其放在内存中,然后在子程序中输出出来。

什么是线程句柄

线程句柄是创建线程后的一个标识符,该标识符是用来操作这个线程的。不用时需要关闭句柄

启动线程后传入第三个参数就会返回线程句柄,如果不传递该参数变量就会默认将这个线程句柄关闭掉。

线程启动后是可以将线程句柄关闭掉的,线程还是会继续执行,会按照线程子程序里的代码按部就班的执行,只不过是无法操作这个线程了,如暂停、继续之类的。

注:句柄在不用后需要关闭掉,如果不关闭会一直累加,因为没有手动释放它。

注:当启动线程后程序并不会等这个线程执行完,只是负责告诉系统要启动一个线程。

什么是线程ID

线程ID是用来区分不同线程的,实际能使用到的情况并不多,以标识为主,不需要额外的关闭。

因为线程ID只是一个标识,是没有关闭的操作的,这个id得到了就表示这个线程是存在的,线程执行完后这个id也会被系统销毁掉。

线程执行的方式与优先级

线程是以抢占式运行的,所以线程执行起来之后是没有顺序的。

注:在进程当中是存在优先级概念的,在线程当中其实也是存在优先级的,但是在windows系统中线程是以抢占式运行的 。

线程抢占式运行的详细方式如下:

线程是在cpu中进行执行的,执行起来是没有任何顺序的。

一个cpu核心只能同时执行一个线程,所以cpu会随时执行一个线程,由于cpu的快速切换,所以使程序看起来是连续执行的。

由于现在的cpu都是多核多线程的,所以就可以同时执行多个线程了。

示例:

代码在执行的时候,很有可能刚刚执行到了一半,CPU就发生了切换,这个时候,就会执行其他的代码,这样我们就不能完全保证程序按照我们的预期来进行执行了。

线程的一些疑问?

关闭线程句柄之后,线程是否会结束?

在线程中关闭句柄线程也不会结束,因为句柄只是相当于操作这个线程用的标识符,你把标识符关了跟这个线程是否执行没有关系。

线程中还可以继续执行线程吗?

是可以继续启动线程的。因为在系统当中线程是比较独立的概念,在线程中可以在启动线程,这两个线程互相之间基本上是没有关联的,因为线程都是彼此相对比较独立的。并不是它启动的就是父线程,线程这一块是没有父线程这样的概念的,包括进程实际上也是没有的。

注:这不是递归只是在线程结束后又启动了一个线程,子程序中调用自己才是递归。