![](https://csdnimg.cn/release/download_crawler_static/11959185/bg5.jpg)
行初始化。对于c b S t a c k参数来说,C r e a t e P r o c e s s使用存放在可执行文件中的一个值。可以使用
链接程序的/ S TA C K 开关来控制这个值:
r e s e r v e参数用于设定系统应该为线程堆栈保留的地址空间量。默认值是 1 MB。C o m m i t参
数用于设定开始时应该承诺用于堆栈保留区的物理存储器的容量。默认值是 1页。当线程中的
代码执行时,可能需要多个页面的存储器。当线程溢出它的堆栈时,就生成一个异常条件(关
于线程堆栈和堆栈溢出的异常条件的详细说明,参见第 1 6章,关于一般异常条件的处理的详细
说明,参见第2 3 章)。系统抓取该异常条件,并且将另一页(或者你为 c o m m i t 参数设定的任何
值)用于保留空间,这使得线程的堆栈能够根据需要动态地扩大。
当调用C r e a t e T h r e a d时,如果传递的值不是0,就能使该函数将所有的存储器保留并分配给
线程的堆栈。由于所有的存储器预先作了分配,因此可以确保线程拥有指定容量的可用堆栈存
储器。保留空间的容量既可以是/ S TA C K 链接程序设定的容量,也可以是 C b S t a c k 的值,谁大就
用谁。分配的存储器容量应该与传递的 c b S t a c k 值相一致。如果将 0传递给 C b S t a c k 参数,
C r e a t e T h r e a d就保留一个区域,并且将链接程序嵌入 . e x e文件的/ S TA C K链接程序开关信息指明
的存储器容量分配给线程堆栈。
保留空间的容量用于为堆栈设置一个上限,这样就可以抓住代码中的循环递归错误。例如,
你编写一个递归自调用函数,该函数也包含导致循环递归的一个错误。每次函数调用自己的时候,
堆栈上就创建一个新的堆栈框。如果系统不设定堆栈的最大值,该递归函数就永远不会停止对自
己的调用。进程的所有地址空间将被分配,大量的物理存储器将被分配给该堆栈。通过设置一个
堆栈限制值,就可以防止应用程序用完大量的物理存储器,同时,也可以更快地知道何时程序中
出现了错误(第1 6 章中的S u m m a t i o n 示例应用程序显示了如何跟踪和处理应用程序中的堆栈溢出)。
6.4.3 pfnStartAddr和p v P a r a m
p f n S t a r t A d d r参数用于指明想要新线程执行的线程函数的地址。线程函数的 p v P a r a m参数与
原先传递给C r e a t e T h r e a d 的p v P a r a m 参数是相同的。C r e a t e T h r e a d使用该参数不做别的事情,只
是在线程启动执行时将该参数传递给线程函数。该参数提供了一个将初始化值传递给线程函数
的手段。该初始化数据既可以是数字值,也可以是指向包含其他信息的一个数据结构的指针。
创建多个线程,使这些线程拥有与起始点相同的函数地址,这是完全合乎逻辑的并且是非常
有用的。例如,可以实现一个We b服务器,以便创建一个新线程来处理每个客户机的请求。每个
线程都知道它正在处理哪个客户机的请求,因为当创建线程时,你传递了一个不同的p z P a r a m值。
记住,Wi n d o w s是个抢占式多线程系统,这意味着新线程和调用 C r e a t e T h r e a d 的线程可以
同时执行。由于线程可以同时运行,就会出现一些问题。请看下面的代码:
第 6章 线程的基础知识计计125