随笔-19  评论-2  文章-0  trackbacks-0

2009-10-7

=======================
《深入解析MFC》笔记 12. 进程与线程
=======================
   
    核心对象
                        核心对象            产生方法
                        event               CreateEvent
                        mutex               CreateMutex
                        semaphore       CreateSemaphore
                        file                    CreateFile
                        file-mapping     CreateFileMapping
                        process             CreateProcess
                        thread              CreateThread
                       
    进程的生命周期:                                            《深入浅出MFC》P39
        1、shell调用 CreateProcess 激活 App.exe
        2、系统产生一个进程核心对象,计数值为1.
        3、系统在此进程建立一个4GB地址空间。
        4、加载器将必要的代码加载到上述地址空间中,包括App.exe的程序、数据,以及所需的动态链接函数库(DLLs)。
        5、系统为此进程建立一个线程,成为主线程,现成才是CPU时间的分配对象。
        6、系统调用 C runtime 函数库的 Startup code。
        7、startup code 调用 App程序的 WinMain函数。
        8、App开始运行。
        9、使用者关闭App主窗口,是WinMain消息循环结束,WinMain结束
        10、回到Startup code。
        11、回到系统,系统调用 ExitProcess结束进程
       
    产生子进程:
        CreateProcess(
            LPCSTR lpApplicationName,  //指定可执行文件名
            LPSTR  lpCommandLine,    //指定欲传给新进程的命令行参数
            LPSECURITY_ATTRIBUTES  lpProcessAttributes,
            LPSECURITY_ATTRIBUTES  lpThreadAttributes,
            BOOL   bInheritHandles,       //指定3、4的安全属性是否需要被继承
            DWORD  dwCreationFlags,   //标识组合
            LPVOID   lpEnvironment,      //指定进程所使用的环境变量区,Null或父进程环境变量
            LPCSTR   lpCurrentDirectory,      //设定子进程的工作目录与工作驱动器,若为NULL,继承父进程
            LPSTARTUPINFO  lpStartupInfo,       //指向一个 STARTUPINFO结构的指针,
            LPPROCESS_INFORMATION  lpProcessInformation     
        );           

    线程的生命周期:                《深入浅出MFC》P41
        调用CreateThread产生额外的线程时,系统完成以下工作
            1、配置“线程对象”,其handle将成为 CreateThread 的返回值
            2、设定计数器为 1.
            3、配置线程 context。
            4、保留线程的堆栈。
            5、将 context 中的堆栈指针缓存器(SS)和指令指针缓存器(IP)设定妥当。
   
    CreateThread ( LPSECURITY_ATTRIBUTES  lpThreadAttributes,    //安全属性的设定及继承
                        DWORD  dwStackSize,                                             //堆栈大小
                        LPTHREAD_START_ROUTINE   lpStartAddress,        //设定“线程函数”的名称
                        LPVOID  lpParameter,
                        DWORD  dwCreationFlags,            //为0,则线程立即开始执行。
                        LPDWORD  lpThreadId                 //纺织线程的ID
                        );
                       
    unsigned  long  _beginthreadex (                                            《深入浅出MFC》P42
        void*  security,
        unsigned  stack_size,
        unsigned  (__stdcall *start_address) (void *),
        void  *arglist,
        unsigned  initflag,
        unsigned*  thrdaddr
        );

 

 

posted on 2010-03-15 23:29 Euan 阅读(888) 评论(0)  编辑 收藏 引用 所属分类: windows

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理