第一章:为什么要千头万绪
1.合作型多任务与抢占型多任务的区别
2.进程、线程的区别
进程 = 内存 + 资源
内存划分:(1)code:程序的可执行部分。
(2)data:程序中的所有变量(不包含局部变量),分为全局变量、静态变量。
(3)stack:堆栈空间,其中有局部变量。
资源划分:(1)核心对象
(2)USER资源
(3)GDI资源
线程:任何时刻下的状态,被定义在进程的某块内存中,以及cpu寄存器上,其他重要数据存储在进程的共享内存中。
3.Context switch
发生中断的时候,CPU 取得目前这个线程的当前状态,也就是把所有寄存器内容拷贝到堆栈之中,再把它从堆栈拷贝到一个CONTEXT 结构;
要切换不同的线程,操作系统应先切换该线程所隶属之进程的内存,然后恢复该线程放在CONTEXT 结构中的寄存器值。
4.Race conditions
链表插入实例。
5.Atomic operation
第二章:线程的第一次接触
1.CreateThread():
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //描述新线程security属性,NULL表示使用缺省值。
DWORD dwStackSize, //新线程堆栈大小,0表示使用缺省大小:1MB
LPTHREAD_START_ROUTINE lpStartAddress, // 新线程开始的起始地址,这是一个函数指针
LPVOID lpParameter, //新线程函数参数
DWORD dwCreationFlags, //允许产生一个暂时挂起的线程,默认立即执行。
LPDWORD lpThreadId //新线程ID被传回这里
);
2.函数调用约定
__stdcall, __cdecl, __thiscall, __fastcall, __nakedcall, __pascal
3.核心对象
进程,线程,文件,事件,信号量,互斥器,管道
4.CloseHandle():
BOOL CloseHandle (
HANDLE hObject //代表一个已打开对象handle
);
5.线程对象与线程的区别
线程的handle 是指向“线程核心对象”,而不是指向线程本身;“线程核心对象”引用到的那个线程也会令核心对象开启。因此,线程对象的默认引用计数是2。
6.GetExitCodeThread():
BOOL GetExitCodeThread(
HANDLE hThread, //线程handle
LPDWORD lpExitCode //指向一个DWORD,用以接收结束代码
);
GetExitCodeThread( )的一个糟糕行为是,当线程还在进行,尚未有所谓结束代码时,它会传回TRUE 表示成功。也就是说你不可能从其返回值中知道“到底是线程还在运行呢,还是它已结束,但返回值为STILL_ACTIVE。
7.ExitThread():
VOID ExitThread(
DWORD dwExitCode //dwExitCode 指定此线程之结束代码
);