一段最简单的线程创建代码如下:
#include <stdio.h>
#include <Windows.h>
DWORD WINAPI ThreadFun(LPVOID pM)
{
printf("子线程的线程ID号为:%d\n子线程输出Hello Thread\n", GetCurrentThreadId());
return 0;
}
int main()
{
HANDLE handle;
printf("--------------------最简单的创建多线程实例--------------------\n");
handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
WaitForSingleObject(handle, INFINITE);
system("pause");
return 0;
}
在WinDef.h文件中,有如下定义:#define WINAPI __stdcall
被__stdcall这个关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传), 函数调用在返回前要由被调用者清理堆栈。详见:
在WTypes.h文件中有如下定义:typedef unsigned long DWORD;
,即DWORD就是unsigned long
在WinDef.h文件中,有如下定义:typedef void far *LPVOID;
,其中far在该文件中有如下描述:#define far
,即far为NULL,具体用这样的方法来选择程序中的某部分是否编译。
GetCurrentThreadId在WinBase.h中有如下声明:
WINBASEAPI DWORD WINAPI GetCurrentThreadId(VOID);
其中WINBASEAPI 在WinBase.h中有如下描述:
#if !defined(_KERNEL32_)
#define WINBASEAPI DECLSPEC_IMPORT
#else
#define WINBASEAPI
#endif
其中DECLSPEC_IMPORT在WinBase.h中有如下描述:
#if (defined(_M_IX86) || defined(_M_IA64) || defined(_M_AMD64)) && !defined(MIDL_PASS)
#define DECLSPEC_IMPORT __declspec(dllimport)
#else
#define DECLSPEC_IMPORT
#endif
WINBASEAPI __out_opt HANDLE WINAPI CreateThread
(
__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in_opt __deref __drv_aliasesMem LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId
);
第一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置。
第二个参数表示线程栈空间大小。传入0表示使用默认大小(1MB)。
第三个参数表示新线程所执行的线程函数地址,多个线程可以使用同一个函数地址。
第四个参数是传给线程函数的参数。
第五个参数指定额外的标志来控制线程的创建,为0表示线程创建之后立即就可以进行调度,如果为CREATE_SUSPENDED则表示线程创建后暂停运行,这样它就无法调度,直到调用ResumeThread()。
第六个参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号。
返回值:函数成功,返回线程句柄;函数失败返回false。若不想返回线程ID,设置值为NULL。
函数说明:
创建一个线程。
语法:
hThread = CreateThread (&security_attributes, dwStackSize, ThreadProc,pParam, dwFlags, &idThread) ;
一般并不推荐使用 CreateThread函数,而推荐使用RTL库里的System单元中定义的 BeginThread函数,因为这除了能创建一个线程和一个入口函数以外,还增加了几项保护措施。
在MFC程序中,应该调用AfxBeginThread函数,在Visual C++程序中应调用_beginthreadex函数。
WaitForSingleObject函数详见下文:
https://baike.baidu.com/item/WaitForSingleObject/3534838?fr=aladdin
以上代码在Visual Studio 2010中运行结果如下:
参考文献:http://blog.csdn.net/morewindows/article/details/7421759