(C++多线程问题)CreateThread()函数问题
一、Windows API函数。该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。
二、CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:
1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回
2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1
3.分配context结构
4.分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD
5.lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数
6.把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数
三、MSDN中CreateThread原型:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)
processthreadsapi.h中CreateThread原型:
WINBASEAPI
_Ret_maybenull_
HANDLE
WINAPI
CreateThread(
_In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_SIZE_T dwStackSize,
_In_LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt___drv_aliasesMemLPVOID lpParameter,
_In_DWORD dwCreationFlags,
_Out_opt_LPDWORD lpThreadId
);
四、示例:
2013-08-17
2013-08-17
(2)LPVOID lpParameter 则是传递给线程函数的参数,也即传递给(1)中指定的线程函数的地址。
以下是一个例子:创建线程后,将转到线程函数执行,遇到return语句后返回到main函数。
#include <iostream>
#include <windows.h>
using namespace std;
/*ThreadProc为LPTHREAD_START_ROUTINE lpStartAddress
*参数指定的线程函数.lpParam则是LPVOID lpParameter指
*定的传递给线程函数的参数*/
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
for (int i = 0;i < 20;++i)
{
cout << "I am from a thread,count = " << i <<endl;
}
return 0;
}
int main()
{
HANDLE hThread;
DWORD dwThreadID;
hThread = ::CreateThread(
NULL,
NULL,
ThreadProc, // 线程入口地址
NULL,
0,
&dwThreadID);
::WaitForSingleObject(hThread,INFINITE);
::CloseHandle(hThread);
return 0;
}