您的位置:首页 > 编程语言

Windows平台下多线程编程基本步骤

2012-12-03 20:15 531 查看
首先说明一下句柄的概念:一种指向指针的指针。由于Windows是一个以虚拟内存为基础的操作系统,在这种系统环境下,Windows是一个以虚拟内存为基础的操作系统,在系统环境下,windows内存管理器在内存中来回移动对象,对象被移动也就是对象的地址变化了。Windows为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化。对象被移动后,对象新的地址就会告知其句柄来保存。其关系如下:

句柄地址(稳定)->记载着对象在内存中的地址->对象在内存中的地址(不稳定)->实际对象。

1)创建线程:

HANDLE WINAPI CreateThread(

__in          LPSECURITY_ATTRIBUTES lpThreadAttributes,

__in          SIZE_T dwStackSize,

__in          LPTHREAD_START_ROUTINE lpStartAddress,

__in          LPVOID lpParameter,

__in          DWORD dwCreationFlags,

__out         LPDWORD lpThreadId

);

第一个参数lpThreadAttributes指向一个SECURITY_ATTRIBUTES结构的指针,该结构决定了线程的安全属性,一般置为NULL;

第二个参数dwStackSize指定了线程的堆栈深度,一般都设置为0;

第三个参数lpStartAddress表示新线程开始执行时代码所在函数的地址,即线程的起始地址。每个线程都必须有一个入口点函数,是线程执行的起点。系统创建好进程后,实际上就启动执行了该进程的主线程。主线程的入口点函数是main或WinMain。每个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在程序中创建其他线程。这里ThreadFunc即表示新线程入口函数的函数名。

第四个参数lpParameter指定了线程执行时传送给线程的32位参数,即线程函数的参数;第五个参数dwCreationFlags控制线程创建的附加标志,可以取两种值。如果为0,表示线程在被创建后就会立即开始执行;如果该参数为CREATE_SUSPENDED,则系统产生线程后,该线程处于挂起状态,并不马上执行,直到ResumeThread被调用。第六个参数lpThreadId,当我们创建一个线程时,系统会为这个线程分配一个ID号,在NT/2000下该参数可以设为NULL。即线程的ID号不用返回。

2)线程函数的声明和实现

新线程入口函数的声明和实现形式如下:

DWORD WINAPI ThreadProc(

[in]                 LPVOID lpParameter

);

DWORD WINAPI ThreadProc( LPVOID lpParameter )

{

return 0;

};


3)线程句柄的关闭

BOOL WINAPI CloseHandle(

__in          HANDLE hObject

);

每个线程,都有一个线程内核对象的引用计数器,关闭线程的句柄,其内核对象的引用计数就减1。

4)线程之间的同步

线程的同步有以下几种方式:

1)等待函数

2)事件

3)信号量

4)互斥量
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: