CreateThread函数
1、CreateThread函数概述
要创建一个或多个辅助线程(辅助函数),只需要让一个已经运行的线程来调用CreatThread
HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa, DWORD cbStack,
PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam,
DWORD fdwCreate, PDWORD pdwThreadID);
当CreateThread被调用时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。这与进程和进程内核对象之间的关系是相同的。
系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和同一个进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易地互相通信。
CreateThread函数是用来创建线程的Windows函数。编写C/C++代码,编译环境的 C/C++运行期库函数。(如Visual的_beginthreadx)
psa参数:是指向PSECURITY_ATTRIBUTES结构的指针。如果希望所有的子进程能够继承该线程对象的句柄,必须设定一个PSECURITY_ATTRIBUTES结构(通常在Windows 98中忽略该参数。在Windows NT中,它被设为NULL)。
cbStack参数:用于设定线程线程堆栈的大小。可以使用链接程序的/ S TA C K开关来控制这个值:
/STACK:[reserve] [.commit] 。reserve参数用于设定系统应该为线程堆栈保留的地址空间量。默认值是 1 MB, commit参数用于设定开始时应该承诺用于堆栈保留区的物理存储器的容量。默认值是 1页。
1cbStack的值不是0,就能使该函数将所有的存储器保留并分配给线程的堆栈。容量是 /STACK链接程序与CbStack中最大的一个值。分配的存储器容量应该与传递的 c b S t a c k值相一致。
2cbStack的值是0,保留一个区域,并且将链接程序嵌入. e x e文件的/ S TA C K链接程序开关信息指明的存储器容量分配给线程堆栈。
保留空间的容量用于为堆栈设置一个上限,这样就可以抓住代码中的循环递归错误。
pfnStartAddr参数:用于指定新线执行的程线程函数的地址。
pvParam参数:CreateThread使用该参数不做别的事情,只是在线程启动执行时将该参数传递给线程函数。该参数提供了一个将初始化值传递给线程函数的手段。该初始化数据既可以是数字值,也可以是指向包含其他信息的一个数据结构的指针。
fdwCreate参数:可以设定用于控制创建线程的其他标志。该参数值为0时线程创建后可以立即进行调度。是 CREATE_SUSPENDED,系统暂停该线程的运行,使得应用程序在执行任何代码之前修改线程的某些属性。(由于这种必要性很少,因此该标志并不常用)。
pdwThreadID参数:它必须是DWORD的一个有效地址,CreateThread使用这个地址来存放系统分配给新线程的I D