为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

设置线程堆栈大小

2017-11-14 4页 doc 18KB 14阅读

用户头像

is_601191

暂无简介

举报
设置线程堆栈大小设置线程堆栈大小 设置线程堆栈大小 作者莫小发表于2010-08-06 2345原文链接阅读1评论0 每个线程 都有一个堆栈那么这个堆栈多大呢 HANDLE CreateThread LPSECURITY_ATTRIBUTES lpThreadAttributes SIZE_T dwStackSize LPTHREAD_START_ROUTINE lpStartAddress LPVOID lpParameter DWORD dwCreationFlags LPDWORD lpThreadId 在创建线程的时候可以指定堆...
设置线程堆栈大小
设置线程堆栈大小 设置线程堆栈大小 作者莫小发表于2010-08-06 2345原文链接阅读1评论0 每个线程 都有一个堆栈那么这个堆栈多大呢 HANDLE CreateThread LPSECURITY_ATTRIBUTES lpThreadAttributes SIZE_T dwStackSize LPTHREAD_START_ROUTINE lpStartAddress LPVOID lpParameter DWORD dwCreationFlags LPDWORD lpThreadId 在创建线程的时候可以指定堆栈大小 dwStackSize0则使用默认大小 -那默认大小又是多少 写个小程序算一下 include stdio.h include windows.h define STACK_SIZE 0.510241024 DWORD WINAPI ThreadFuncPVOID pvParam DWORD dwRet0 printf-3d0xxnpvParamdwRet return dwRet int mainintchar DWORD dwTid printfMain0xxndwTid forint i0i 50i CreateThreadNULLSTACK_SIZEThreadFuncPVOIDi0dwTid//莫小注原作者这处代码 有错这不能修改线程栈大小 Sleep2000 return 0 输出 Main0x12ff78 00x50ffb0 10x60ffb0 20x70ffb0 30x80ffb0 40x90ffb0 0x60ffb0-0x50ffb00x 100000 byte1MB 那 么这个小程序中线程最小堆栈大小为1MB.对么为什么呢后面有验证 将 STACK_SIZE换成0结果和上面一样 将STACK_SIZE换成2结果变成2MB 以下是从 MSDN中查到的 Generallythe reserve size is the default reserve size specified in theexecutable header.Howeverif the initially committed size specified by dwStackSize is larger than the default reserve sizethe reserve size is this new commit size rounded up to the nearest multiple of 1MB. 根据winnt.h中的IMAGE_OPTIONAL_HEADER结构体 typedef struct _IMAGE_OPTIONAL_HEADER // //Standard fields. // WORD Magic BYTE MajorLinkerVersion BYTE MinorLinkerVersion DWORD SizeOfCode DWORD SizeOfInitializedData DWORD SizeOfUninitializedData DWORD AddressOfEntryPoint DWORD BaseOfCode DWORD BaseOfData // //NT additional fields. // DWORD ImageBase DWORD SectionAlignment DWORD FileAlignment WORD MajorOperatingSystemVersion WORD MinorOperatingSystemVersion WORD MajorImageVersion WORD MinorImageVersion WORD MajorSubsystemVersion WORD MinorSubsystemVersion DWORD Win32VersionValue DWORD SizeOfImage DWORD SizeOfHeaders DWORD CheckSum WORD Subsystem WORD DllCharacteristics DWORD SizeOfStackReserve DWORD SizeOfStackCommit DWORD SizeOfHeapReserve DWORD SizeOfHeapCommit DWORD LoaderFlags DWORD NumberOfRvaAndSizes IMAGE_DATA_DIRECTORY DataDirectoryIMAGE_NUMBEROF_DIRECTORY_ENTRIES IMAGE_OPTIONAL_HEADER32PIMAGE_OPTIONAL_HEADER32 我推测应该可 以在链接期间指定栈大小 查看link.exe的参数 /STACKreservecommit 果然如此 看 到网上有人问如何改变默认的线程堆栈大小在MSDN中有 The default size for the reserved and initially committed stack memory is specified in the executable file header.Thread or fiber creation fails if there is not enough memory to reserve or commit the number of bytes requested.To specify adifferent default stack size for all threads and fibersuse the STACKSIZE statement in the module definition.deffile.For more information on these default sizes and how to change themsee the documentation included with your linker. 模块定义.def文件为链接器提供有关被链接程序的导出、属 性及其他方面的信息 可见默认线程堆栈大小在链接阶段可以由程序员指定 以上部 分载自他人空间. MSDN中有段话很重要 To change the reserved stack sizeset thedwCreationFlagsparameter ofCreateThreadorCreateRemoteThreadtoSTACK_SIZE_PARAM_IS_A_RESERVATIO Nand use thedwStackSizeparameter. 我用MSDN2001版查看的时候它有注明 STACK_SIZE_PARAM_IS_A_RESERVATION适用于XP系统在MSDN2008版没注 明了我是在XP下测试的 下面是我改的测试代码 代码 1includestdafx.h 2include stdio.h 3include windows.h 4 5define STACK_SIZE 641024//设置线程栈为64K 6 7 DWORD WINAPI ThreadFuncPVOID pvParam 8 9 DWORD dwRet0 10 printf-3d0xxnpvParamdwRet 11 Sleep2000//避免线程退出这个线程栈地址又被分配给 其它新创建的线程 12 return dwRet 13 14 15 int mainintchar 16 17 DWORD dwTid 18 printfMain0xxndwTid 19 20 HANDLE handles10 21 22 forint i0i 10i 23 24 handlesiCreateThreadNULLSTACK_SIZEThreadFuncPVOIDiSTACK_SIZE_PARAM_IS_A_RESERVATIONdwTid 25 Sleep100//保证每次Create后得到的线程栈地址是递 增的 26 27 forint i0i 10i 28 29 CloseHandlehandlesi 30 31 32 getchar 33 return0 34---CreateThreadNULLSTACK_SIZEThreadFuncPVOIDiSTACK_SIZE_PARAM_IS_A_RESERVATIONdwTid 运行结果 每次相差10000x655366d641024设置成功64K. 另外Linux平台的栈默认大小应该是8192KBWindows平台的栈默认大小应该是 1024KB项目移植的时候要注意设置免得空间不足分配失败 评论0查看评论发表评 论 程序员找工作就在博客园 最新新闻 ?小众化的豆瓣2010-08-06 2259 ?第二季度 全球10大IT并购SAP收购Sybase居首2010-08-06 2212 ?商业周刊问答服务网站如何 盈利2010-08-06 2210 ?社交新闻网Digg曝作弊团体宣扬极端扼杀进步2010-08-06 2209 ?史玉柱一天10小时都玩游戏我的时间不值钱2010-08-06 2207 编辑推荐创业必 读可疑的成功 网站导航博客园首页个人主页新闻闪存小组博问社区知识库
/
本文档为【设置线程堆栈大小】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索