您的位置:首页 > 其它

多线程学习笔记 一

2008-12-04 13:14 316 查看
产生一个多线程是以 CreateThread()作为一切行动的开始。此函数原型如下:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);

参数说明:
lpThreadAttributes 描述施行于这一新线程的 security 属性,NULL 表示使用缺省值。
dwStackSize 新线程拥有自己的堆栈。0表示使用缺省大小。
lpStartAddress 新线程将开始的起始地址,这是一个函数指针。(在C语言中函数名称即代表函 数指针,所以这里可放一个函数名称)

lpParameter 此值将被传送到上述所指定之新线程函数去,作为线程函数的参数。
dwCreationFlags 允许你产生一个暂时挂起的线程,默认情况是立即开始执行,若值为 CREATE_SUSPENDED 挂起线程直到调用 ResumeThread( HANDLE hThread
); 来启动挂起的线程。
lpThreadId 新线程ID 会被传回到这里。

返回值:
如果CreateThread()成功,传回一个handle,代表新线程,否则传回一个FALSE,如果失败你可以调用GetLastError()获知原因。

事例程序:
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

DWORD WINAPI ThreadFunc(LPVOID);

int main()
{
HANDLE hThrd;
DWORD threadId;
int i;

for (i=0; i<5; i++)
{
hThrd = CreateThread(NULL,
0,
ThreadFunc,
(LPVOID)i,
0,
&threadId );
if (hThrd)
{
printf("Thread launched %d/n", i);
CloseHandle(hThrd);
}
}
// Wait for the threads to complete.
// We'll see a better way of doing this later.
Sleep(2000);

return EXIT_SUCCESS;
}

DWORD WINAPI ThreadFunc(LPVOID n)
{
int i;
for (i=0;i<10;i++)
printf("%d%d%d%d%d%d%d%d/n",n,n,n,n,n,n,n,n);
return 0;
}

特别注意ThreadFunc()的函数定义:
DWORD WINAPI ThreadFunc(LPVOID n)
CreateThread()的函数声明中期望第三个参数是个函数指针,指向某种待定类型的函数:返回值为 DWORD ,调用约定是 WINAPI 有一个 LPVOID 参数。换句话说,如果你的线程函数不符合这些要求,编译时便会出现错误信息。一开始就精准的声明正确的函数类型,比日后再强制转换(cast)好。

线程结束代码(Exit Code)
线程结束代码可以籍着调用GetExitCodeThread()(并给予 CreateThread 所获得的线程ID作为参数)而得知:
BOOL GetExitCodeThread(
HANDLE hThread,
LPDWORD lpExitCode);
参数说明:
hThread 由CreateThread()传回的线程 handle
lpExitCode 指向一个DWORD,用以接受结束代码(exitcode)

返回值:
  如果成功,GetExitCodeThread()传回TRUE,否则传回FALSE。如果失败你可以调用GetLastError()找出原因。如果线程已经结束,那么线程的结束代码会被放在 lpExitCode 参数中带回来。如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: