windows笔记创建线程的函数CreateThread

主线程的进入点函数的名字必须是main、main、WinMain或wWinMain,其它线程必须用不同的名字
主线程的进入点函数传递了字符串参数,因此可以使用 ANSI/Unicode版本的进入点函数:main/wmain和WinMain/wWinMain。
线程函数必须返回一个值,它将成为该线程的退出代码。
线程函数(实际上是我们的所有函数)应该尽可能使用函数参数和局部变量。

CreateThread函数

HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpsa,
DWORD cbStack,
LPTHREAD_START_ROUTINE lpStartAddr,
LPVOID lpvThreadParam,
DWORD fdwCreate,
LPDWORD lpIDThread
);

当CreateThread被调用时,系统创建一个线程内核对象。( _beginthreadex也可以创建线程)

内核对象

该线程内核对象不是线程本身,而是操作系统用来管理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结构。这与进程和进程内核对象之间的关系是相同的。系统从进程的地址空间中分配内存,供线程的堆栈使用。新线程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程中的所有内存和在这个相同的进程中的所有其他线程的堆栈。这使得单个进程中的多个线程确实能够非常容易地互相通信。

参数lpsa

psa参数一般给它传NULL。

psa参数是指向SECURITY_ATTRIBUTES结构的指针,见:内核对象的安全性

参数cbStack

cbStack参数一般给它传0.

cbStack参数用于设定线程可以将多少地址空间用于它自己的堆栈。

CreateProcess使用存放在可执行文件中的一个值。可以使用链接程序的/STACK开关来控制这个值:reserve参数用于设定系统应该为线程堆栈保留的地址空间量。默认值是 1 MB。Commit参数用于设定开始时应该承诺用于堆栈保留区的物理存储器的容量。默认值是 1页。

参数pfnStartAddr和pvParam   

pfnStartAddr参数为要执行的线程函数的地址(即线程函数名

pvParam参数为要传给线程的参数(也只能有一个参数,可以是简单类型、结构类型等)

参数fdwCreate  

fdwCreate参数一般给它传0。

如果给该参数传 CRETE_SUSPENDED,系统可以完整地创建线程并对它进行初始化,但是要暂停该线程的运行,这样它就无法进行调度。CRETE_SUSPENDED标志使得应用程序能够在它有机会执行任何代码之前修改线程的某些属性。不过一般没有这个需要,呵呵。

参数pdwThreadID

它必须是DWORD的一个有效地址,使用这个地址来存放系统分配给新线程的ID。

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/01/1814373.html

原文地址:https://www.cnblogs.com/fangyukuan/p/1814373.html