1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
进程的组成
(1)操作系统用来管理进程的内核对象。
(2)地址空间。
线程:
线程总是在进程环境中创建的。新进程运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄。进程的内存和这个进程中其他线程的堆栈。
当创建一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程,也就是执行main函数的线程,可以把main函数看作是主线程的进入点函数。主线程可以创建其他线程。
线程创建函数 CreateThread
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD 传递NULL,让线程使用默认安全性 SIZE_T dwStackSize, // initial stack size LPTHREAD_START_ROUTINE lpStartAddress, // thread function新进程的入口地址 LPVOID lpParameter, // thread argument DWORD dwCreationFlags, // creation option LPDWORD lpThreadId // thread identifier );
DWORD WINAPI ThreadProc( LPVOID lpParameter // thread data );
简单示例
#include<windows.h> #include<iostream> using namespace std;
DWORD WINAPI ThreadProc( LPVOID lpParameter // thread data );
void main() { HANDLE hThread = CreateThread(NULL,0,ThreadProc,NULL,0,NULL); CloseHandle(hThread);
cout<<"main thread."<<endl; //Sleep(10);
return ; }
DWORD WINAPI ThreadProc( LPVOID lpParameter // thread data ) { cout<<"child thread."<<endl; //Sleep(10); } return 0; }
//在子线程创建后,调用sleep()令主线程让出执行权,子线程的到执行。