读书笔记第五周 -《编程高手箴言》

读书笔记第五周 -《编程高手箴言》

读书笔记第五周

  这周看了好几本书的部分,先是跳着看的《编程高手箴言》的前三章,然后看了一点《STL源码剖析》,之后后买了一本《深入理解计算机系统》第三版(又贵了),豆瓣评分9.7,应该是计算机技术方面评分最高的一本书籍了,原以为会偏体系机构,操作系统之类比较底层的东西,没想到后面每一章节居然都是从底层结构讲起,以切实代码的注意细节结束,花的值啊!看的是程序优化一章虽然还没完但是收获颇丰,也下定决心今年一定把这本书细致的读一下。
  下面还是把收获大体写一下。

编程高手箴言

  • 第一章比较水吧,大概是作者阐述一下多年的行业经验,解答什么程序员是不是吃青春饭,还有他心中的高手境界,然后讲解了他总结的代码规范,然而其实他说的规范现在的ide都自动实现了,所以可能意义不如当时了。 

  • 第二章是汇编的基础,从8086到讲到32位的80386,对寄存器,寻址方式,中断处理做了简要的概述,但是最后那个dos下测内存的方法确实没看懂,大概是我太菜了吧。 

  • 第三章讲到是windows运行机理,前面都没怎么看懂,一直读到消息处理机制才算略有收获,讲解了32位与16位windoows消息运行方式的不同,我理解的是32相比16位,系统的VXD与底层更融合了,实现了程序的独立,简化了消息处理的复杂度。具体运作方式中,使用Getmessage 获取消息,sendmessage将消息放入相应窗口的消息队列中,user便会调用注册在窗口类中的窗口消息处理函数对消息进行处理。我感觉可以这么理解,消息就是含有窗口标志信息(id)以及含有事件信息(鼠标点击还是某个键点击之类的)的数据结构,在具体的处理函数中,只需要对信息进行判别就可以完成相应的功能。 -

    后面觉得还挺有意思的就是线程同步了,因为没有学过相关的课程,只是有一点线程锁的概念。先是讲解了一个CreatRhread创建CloseHandle关闭是否真的会导致内存泄漏的问题,原来是因为线程调用函数库的时候,库中会有全局变量,也因此在创建工程的时候,系统会提示用多线程的库还是单线程的库,因此如果用错库的话很容易引起错误,因此微软就在创建线程的时候绑定一个数据结构将用到的全局变量包含起来使其与线程相关,使得变量与线程相关,(查到这个数据结构叫做tiddata结构),但是这样线程创建时间之类的信息依旧无法获得,因为windows api是静态库,因此就有了-beginthread函数创造线程,但是CloseHandle并不会释放这个结构,就造成了内存泄漏。 综上,假如你执意要用CreatThread创建线程,那么就应该知道此时库函数中有变量是全局的,为了避免错误,应该避免使用库函数,否则就老老实实的用-beginthread与-endThread。 再之后正式讲解线程同步机制,win32API中给了四个同步对象,Evevt(事件),Seqmaphore(信号器),Mutexes(互斥),Critical Section(临界段)

  1. Evevt给与了线程之间高效的协作机会,例如一个线程(1)想要使用另一个线程(2)的排序结果,便可以在(1)中使用 CreatEvevt获得一个句柄,然后用waitforsingleobject选定事件柄,与暂停周期,然后就被挂起,在(2)排序结束后,调用setevent来唤醒(1),这样就避免了(2)排序是时候(1)一直运行导致占用cpu计算资源。
  2. Semaphores,这个在我理解中就是一个资源使用的限制,比如设定只有20个可以使用,那么线程申请资源的时候,数目少于20,就个数++,申请成功,否则线程就被挂起。具体流程大概就是CreatSemaphore获得一个handle给semaphores,然后线程调用资源的时候就用waitforsingleobject申请,是否挂起就决定于资源线程使用数目是否超出semaphore中的最大值。
  3. Mutexes基本就是Semaphores个数为1的情况。
  4. Critical Section,它基本就是同一个进程中线程执行代码时候的互斥,具体是使用一个叫做CRITICAL——SECTION类型的全局变量,线程调用entercriticalsection进入临界段,假如有其他线程已经进入,线程就会被挂起。

  没想到一本书就写了这么多,准备《深入理解计算机系统》再读一些放到下周读书笔记吧。
  其次准备了解一下计算机底层到底是如何处理线程进程的,然后清明找一些多线程编程的书读一下,应该下周制作UI的时候会用到吧,显示倒计时什么的。