一、基本概念
     1.进程
          程序:  程序是计算机指令的集合,它以文件的形式存储在磁盘上。
          进程:  通常被定义为一个正在运行的程序的实例,是一个程序在其
                  自身的地址空间中的一次执行活动。
     2、进程组成
          内核对象:内核对象是操作系统内部分配的一个内存块,该内存块
                    是一种数据结构,其成员负责维护该对象的各种信息。
          地址空间:包含所有可执行模块或者DLL模块的代码和数据。还包含
                    动态内存分配的空间。
     3、进程地址空间
          系统赋予每个进程独立的虚拟地址空间。
     4、线程的组成
          内核对象: 操作系统用它来对线程实施管理。内核对象也是系统
                     用来存放线程统计信息的地方。
          线程栈 :  它用于维护线程在执行代码时需要的所有函数参数和
                     局部变量。  
二、线程创建函数
     HANDLE CreateThread(
          LPSECURITY_ATTRIBUTES lpThreadAttributes, 这里可用为其传递NULL,
                                                    让该线程使用默认的安全性。
          DWORD dwStackSize,                        设置线程初始栈的大小,即线程
                                                    可将多少地址空间用于自己的栈,
                                                    以自己为单位。
          LPTHREAD_START_ROUTINE lpStartAddress,    函数将由新线程执行,表明新线程的
                                                    起始地址。新线程的执行函数地址。
                                                    函数形式如下:
                                                    DWORD WINAPI ThreadProc(LPVOID lpParameter);
          LPVOID lpParameter,                       可用接收命令行参数,可用通过这个参数给
                                                    创建的新线程传递参数。
          DWORD dwCreationFlags,                    设置用于控制线程创建的附加标记。
                                                    0:表示线程创建后立即运行。
          LPDWORD lpThreadId);                      返回线程ID。
三、简单多线程示例
        DWORD WINAPI Fun1Proc(LPVOID lpParameter);
        void main()
        {
            HANDLE hThread1;
            hThread1=CreateThread(NULL,0,Fun1proc,NULL,0,NULL);
            CloseHandle(hThread1);                     子线程并没有结束,只是让引用计数器减1,
                                                       目的让线程结束时自动关闭。
                                                       反之,不能自动关闭。
            cout<<"main thread is running"<<endl;
            Sleep(10);                                 给子线程运行的机会。如果没有,
                                                       主线程一直运行。最后退出main
                                                       则结束进程。子线程不无运行机会。
        }
        DWORD WINAPI Fun1Proc(LPVOID lpParameter)
        {
           cout<<"thread1 is running"<<endl;
           return 0;
        }
四、线程的同步
     1、互斥对象: 它能够确保线程拥有对单个资源的互斥访问权。
          HANDLE CreateMutex(                          返回所创建的互斥对象的句柄。
             LPSECURITY_ATTRIBUTES lpMutexAttributes,  可以给该此案数传递NULL值,
                                                       让互斥对象使用默认的安全性。
             BOOL bInitialOwner,                       指定互斥对象初始化的拥有者,
                                                       如果为真,则创建这个互斥对象
                                                       的线程获得该对象的所有权。
                                                       否则,该线程将不获得所创建的
                                                       互斥对象的所有权。
             LPCTSTR lpName);                          指定互斥对象的名称。如果此参
                                                       数为NULL,则创建一个匿名的互
                                                       斥对象。
            
             BOOL ReleaseMutex(HANDLE hMutex);         该函数将释放指定对象的所有权。
             请求共享对象的使用权来获得所有权。
             DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
             hHandle:  所请求的对象的句柄。
             dwMilliseconds: 指定等待的时间间隔,以毫秒为单位。
                              如果指定的时间间隔已过,函数也返回。