兜兜10

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

第八节 多线程基本知识

一、基本概念
     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: 指定等待的时间间隔,以毫秒为单位。 如果指定的时间间隔已过,函数也返回。

posted on 2010-12-09 15:01  兜兜10  阅读(71)  评论(0)    收藏  举报