自从学了操作系统知识后,我就对多线程比较感兴趣,总想让自己写一些有关多线程的程序代码,但一直以来,发现自己都没怎么好好的去全面学习这方面的知识,仅仅是完成了操作系统课程上的小程序,对多线程的理解也不是很透彻。现在保研了,发现自己的时间也比较充裕了,因此想自己去系统的学习一下多线程的编程,说做就马上做(当时还躺在床上),我立马去图书馆,检索有关多线程的书籍,最终决定选择《Windows环境下多线程编程原理与应用》这本书,虽然有点旧,但对我这个菜鸟来说,还是有很多的东西需要学习的。因此就拿着本书开始自学多线程编程。写这篇随笔,也是为了今后记录自己的学习经历,也希望自己能够坚持下去。
上面的只是一个小插曲,现在开始记录自己今天的学到的知识。 编程之前肯定得先要了解一些基本的概念,比如进程和线程,那什么是进程和线程呢?
<一>进程和线程的自我理解
- 进程:正在运行的程序,拥有内存,CPU时间等一系列资源,在不同的时刻还可以处于不同的状态。
- 线程:Windows系统中最小执行单元,我的理解就是线程“寄生”在进程中,一个进程可以有多个线程,各个线程共享进程中的公共资源。
<二>单线程和多线程比较
- 单线程:一个进程只拥有一个线程,在计算机中的执行顺序就是按部就班,依次执行。
- 多线程:单CPU中,多线程中的“多”,只是给人的一种假像,每一个线程也是按照时间片来执行的,只是执行的速度太快,以至于给人的感觉好像“多”个线程一起在执行,所以站在不同的角度看待事物,给人的感觉也是不一样的(题外话)。
<三>同步对象
- 临界区对象(Critical Section Object):临界区对象,通过提供所有线程必须共享的对象来控制线程。只有拥有临界区对象的线程才可以访问受保护的资源(在临界区中被操作),其他线程必须得到该临界区对象才可以继续执行下去,否则将计入挂起状态(一种线程状态)。获得临界区对象的线程在离开临界区时候需要释放该临界区对象,以便其他线程得到访问权限。
- 互斥对象(Mutex Object):互斥对象和临界区对象的功能很相似,它们的区别是,互斥对象不仅仅保护一个进程中的资源共享,还可以保护进程间(多个进程之间)资源共享。
- 事件对象(Event Object):事件对象用来给线程传递信号,指示线程中某个特定的操作可以开始或者结束。同理,想要执行这个特定操作却没有获得事件对象的线程将处于挂起状态。
- 信号对象(Semaphore Object):信号对象与互斥对象类似,区别在于互斥对象每次只允一个许线程访问数据,信号对象却允许每次多个线程访问数据。
<四>Windows线程调度算法简介
- 总的算法是基于优先级可抢占算法;
- Windows系统将线程的优先级划分为32个等级,0为最低等级,31为最高等级;
- 同一优先级按照FIFS(First In First Service)----先来先服务;
- 为了避免”饿死“,系统动态的改变线程的优先级(降级);
- 当某一个线程正在执行时,高优先级可以抢占其时间片;
- 系统可以动态提高或者降低某些线程的优先级;