多线程笔记1

第一章:为什么要千头万绪

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 指定此线程之结束代码
);

 

posted on 2015-07-10 11:34  那个人好像一条狗  阅读(156)  评论(0编辑  收藏  举报