多线程学习笔记 一
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.
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.
相关文章推荐
- python学习笔记之多线程
- JAVASE学习笔记:第十三章 多线程和网络编程
- Java学习笔记——多线程、GUI
- iOS学习笔记-115.多线程14——NSOperationQueue和NSBlockOperation合用实现多线程
- iOS学习笔记-119.多线程18——NSOperationQueue自定义NSOperation执行一个操作的取消
- Java学习笔记——多线程(二)
- 黑马程序员________多线程的理论及应用学习笔记
- Android 学习笔记之使用多线程实现断点下载...
- JAVA学习笔记_demo_多线程_1
- 学习java多线程的笔记1--Thread(Runnable t)与重写run()方法等
- java多线程学习笔记——相关名词介绍
- 黑马程序员之JAVA学习笔记:多线程学习大总结
- java 多线程学习笔记之进程和线程
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- Java多线程高并发学习笔记(一)——Thread&Runnable
- java-多线程学习笔记
- Java学习笔记--多线程
- Python学习笔记(二十八)多线程
- C++ 多线程 学习笔记(二)
- 多线程学习笔记