《Win32多线程程序设计》读书笔记

1、多线程是无法预测其行为的


2、线程函数的调用约定是WINAPI(实质上是__stdcall)


3、多线程的执行顺序是无法保证的


4、线程并不总是立即启动


5、线程id是一个全局变量,可以独一无二的表示系统任一进程中的某个线程,根据线程id获取的句柄是一个伪句柄


6、所谓的句柄其实就是一个指针,我们的应用程序不能直接取用他


7、核心对象可以有一个以上的拥有者,甚至可以跨进程,为了保持对每一个拥有者的追踪,核心对象保持了一个引用计数,CloseHandle的作用就是让引用计数减一,引用计数为0的时候,该核心对象就会被自动摧毁——这意味着某个进程结束之后,可能还有某些核心对象没有被摧毁


8、worker线程,就是完全不牵扯到图像用户界面,完全用作运算处理的线程


9、线程结束了,但是它产生的核心对象并不会被自动清理


10、线程句柄对应的线程开启的时候会令核心对象的阴影计数加一,因此线程句柄的默认引用计数是2,线程执行完毕之后,计数减一,CloseHandle之后计数再减一


11、引用计数的机制可以保证线程结束后有地方可以写下其返回值,所以在调用CloseHandle之前可以根据句柄获取线程相应的执行信息


12、线程结束代码。函数GetExitCodeThread可以获取线程的结束代码,如果成功则返回true。如果线程还没有执行完毕,结束代码就是STIL_ACTIVE——即只要有线程存在,该函数都会返回true,但是只有当线程执行结束的时候,才会有结束代码


13、注意ExitThread函数是在线程函数内部调用的,该函数会设置线程的结束代码


14、win32强调线程分为GUI线程和worker线程。GUI线程负责界面处理以及主消息循环。GUI线程的定义是:拥有消息队列的线程,任何一个特定窗口的下线总是被产生这一窗口的线程抓到并处理,所有对此窗口的改变也都由该线程完成


15、如果worker线程也产生了一个窗口,那么就会有一个消息队列随之被产生出来并且附着到此线程身上,于是worker线程就会变成GUI线程。就是说worker线程不能够产生窗口、对话框、消息框或者任何与UI有关的东西——总之,worker线程不要直接操纵UI


16、简单和安全!!!


17、使用线程,那么你应该要使用堆内存而不是栈内存


18、主线程结束前,应该等待所有其他的线程结束,最好的方法是:


19、因为worker线程不能直接操纵UI,所以想要进行UI上的操纵只能通过PostMessage(注意不要使用SendMessage)发送消息给UI线程来进行


20、成功设计多线程的关键是:
①各个线程的数据要分离开来,避免使用全局变量(如要使用,必须加锁)
②不要再线程中操纵UI对象
③确定线程的状态,要在主线程结束之前结束所有的工作线程
④让主线程处理UI


21、一些监测线程性能的工具:
①Windows NT 性能监测工具




22、等待什么什么东西(例如等待线程结束)通常是必要的,有以下一些方式:
①Sleep
②GetExitCodeThread,通常这种方式都会消耗大量CPU资源
③WaitFrSingleObject


23、WaitFrSingleObject
①返回值WAIT_FAILED表示调用失败,返回WAIT_TIMEOUT表示超时,当等待的对象变为激发状态时返回WAIT_OBJECT_0。
②通常我们只知道用该函数来等待互斥对象、事件对象,却不知道他也可以用来等待线程结束,对于线程,线程正在运行的时候句柄是未激活状态,当线程执行完毕,线程句柄是激活状态,此时该函数就可以返回了
③如果将超时时间设为0,这个函数会立即返回,可以通过他来检测线程对象(或其他内核对象)的状态,如果对象已经激发,会返回WAIT_OBJECT_0,否则返回WAIT_TIMEOUT
④内核对象有两种状态:激活(授信),未激活(失信)
⑤当内核对象被激发的时候,WaitFrSingleObject就会返回,否则一直在等待
⑥当WaitFrSingleObject函数在等待的时候,线程会进入睡眠状态,不会消耗cpu资源

你可能感兴趣的:(《Win32多线程程序设计》读书笔记)