诞生与死亡(进程与线程的深入浅出)

进程的诞生与死亡

程序的运行必定会产生一个进程(process)

流程如下:<1>呼叫CreateProcess启动exe。

      <2>系统产生“进程核心物件”,计数值为1;

      <3>系统为进程分配地址空间。

      <4>载入器将必要的码再入到上述位地址空间,包括exe的程序、资料以及DLLS。(需要的DLLS被记录在.idata section);

      <5>系统为进程建立执行绪(primary thread),cpu为执行绪分配之行时间。

      <6>系统呼叫 C runtime函数库的Startup code;

     <7>Startup code 呼叫exe程序的WinMain函数。

     <8>exe运行。

     <9>使用者关闭exe,使WinMain中的讯息回路结束掉,WinMain结束。

     <10>回到 Startup code。

     <11>回到系统,系统呼叫ExitProcess结束进程。

进程创建函数CreateProcess();

进程自我结束可以调用ExitProces

结束别的进程调用 TerminateProcess();但是这种方法一般不安全,因为一般进程结束时,系统会通知进程所有开启的dlls都关闭,但是TerminateProcess结束一个进程系统却不会做这些事。最好的方法是

 

PROCESS_INFORMATION ProcInfo;
BOOL fSucess;

fSucess= CreateProcess(...,&ProcInfo);
if(fSucess){
   CloseHandle(ProcInfo.hThread);
   CloseHandle(ProcInfo.hProcess);
}
线程的创建和死亡:创建函数如下:

CreateThread();

_beginthreadex()

终结线程函数如下: TerminateThread()//该函数数不要使用,让线程自己善终最为妥当。

例子:

#include<afx.h>
#include <stdio.h>
#include <windows.h>
#include <process.h>

unsigned _stdcall myfunc(void *p);
void main()
{
	HANDLE thd;
	unsigned tid;
	thd =(HANDLE) _beginthreadex(NULL,
							0,
							myfunc,
							0,
							0, 
							&tid);
	WaitForSingleObject(thd,5000);
	if (thd != NULL)
	{
		CloseHandle(thd);
	
	}
	
	

}
unsigned _stdcall myfunc(void *p)
{
	char str[50];
	SYSTEMTIME st;
	for (int i = 0; i < 10; i++)
	{
		GetSystemTime(&st);
		sprintf(str, "%u:%u:%u", st.wHour, st.wMinute, st.wSecond);
		printf("当前时间:%s \n", str);
		Sleep(1000);
	}
	getchar();
	getchar();
	return NULL;
}

WaitForSingleObject(thd,5000);//等待线程结束。


猜你喜欢

转载自blog.csdn.net/iloveyou418/article/details/78991802