Win32 Thread Basics 线程 默认堆栈大小
来源:互联网 发布:去淘宝总部申诉 编辑:程序博客网 时间:2024/05/06 12:33
一直在用线程,但是一直没时间认真研究一下
今天从 Jeffrey Richter的<<Programming Applications for Microsoft Windows>>看起,然后慢慢展开
-What's process?
A process actually consists of two components
* A Process Kernel Object
* An Address Space
Process=Process Kernel Object + Address space
hoho,it's really a suprise to me, it's different from my impression on process
-What's Thread?
Similarly, a thread is also consists of two components:
* A Kernel Object that system used to manage thread
* A thread stack~~
-Process vs. Thread
Jeffrey said that the process is inert, it's just a container for threads!!
Threads are created in the context of a process and live their entire life in that process.
By default, there is only one thread in the process --- your entry-point function,(main,wmain,WinMain,wWinMain)
anyway, you can create your own threads, and all these thread live in the process. They
may share the codes,data and kernel object handles
Process require more system resources and memory than threads. Because a process has
a Virtual Address Space, and creating a virtual address space requires a lot of system resources.
Since .exe and .dll files are loaded in to the address space file resources are also required~
Because thread require less overheads than process, you should solve your problem using thread
and avoid create new process. However, this is not a rule, your experience will guide you.
------------------------------------------------------------------------------------------------------------------
-既然每个线程都有一个堆栈那么,这个堆栈多大呢?
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
在创建线程的时候可以指定堆栈大小,dwStackSize=0则使用默认大小
-那默认大小又是多少?
写个小程序算一下~
#include <stdio.h>
#include <windows.h>
#define STACK_SIZE 0.5*1024*1024
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
DWORD dwRet = 0;
printf("%-3d:0x%x/n",pvParam,&dwRet);
return dwRet;
}
int
main(int,char**)
{
DWORD dwTid;
printf("Main:0x%x/n",&dwTid);
for(int i=0;i<50;i++)
CreateThread(NULL,STACK_SIZE,ThreadFunc,(PVOID)i,0,&dwTid);
Sleep(2000);
return 0;
}
输出:
Main:0x12ff78
0 :0x50ffb0
1 :0x60ffb0
2 :0x70ffb0
3 :0x80ffb0
4 :0x90ffb0
0x60ffb0 - 0x50ffb0 = 0x100000 byte = 1MB
那么这个小程序中线程最小堆栈大小为1MB. (对么?为什么呢?后面有验证)
将STACK_SIZE换成0, 结果和上面一样
将STACK_SIZE换成2, 结果变成2MB
以下是从MSDN中查到的
Generally, the reserve size is the default reserve size specified in the executable header. However, if the initially committed size specified by dwStackSize is larger than the default reserve size, the reserve size is this new commit size rounded up to the nearest multiple of 1 MB.
根据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 DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
我推测,应该可以在链接期间指定栈大小
查看link.exe的参数
/STACK:reserve[,commit]
果然如此~~
看到网上有人问如何改变默认的线程堆栈大小,在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 a different default stack size for all threads and fibers, use the STACKSIZE statement in the module definition (.def) file. For more information on these default sizes and how to change them, see the documentation included with your linker.
(模块定义 (.def) 文件为链接器提供有关被链接程序的导出、属性及其他方面的信息)
可见,默认线程堆栈大小在链接阶段可以由程序员指定
- Win32 Thread Basics 线程 默认堆栈大小
- 改变默认堆栈大小
- SylixOS线程堆栈大小浅析
- symbian修改系统默认堆栈空间大小
- C++如何设置默认堆栈的大小
- 【C++】修改VS2013的默认堆栈大小
- vs中修改程序默认堆栈大小
- 关于线程堆栈大小的注意事项
- 关于线程堆栈大小的注意事项
- 线程堆栈大小 pthread_attr_setstacksize 的使用
- 线程堆栈大小 pthread_attr_setstacksize 的使用
- 线程堆栈大小的使用介绍
- 关于线程堆栈大小的注意事项-转
- 线程堆栈大小的使用介绍
- 线程堆栈大小的使用介绍
- 设置线程堆栈大小 每个线程都有一个堆栈那么,这个堆栈多大呢?
- 设置CLR线程池的默认大小
- 获取线程堆栈的默认空间的演示
- sql server 用户登录不了的问题
- 笔记本温度正常吗?我的位置是郑州.
- PC_Lint
- mysql 问题
- CSS下拉菜单
- Win32 Thread Basics 线程 默认堆栈大小
- MFC隐藏显示任务栏,菜单栏及输入法面板 收藏
- 关于元数据
- 枚举串口四法
- 有问必答:你需要无线显示技术么?
- 从此开始
- MFC的Dialog中为PPC创建菜单 收藏
- AVL树的插入、删除、旋转
- Intel promises to bring wireless display technology to other mobile devices