VC++多线程编程

来源:互联网 发布:java怎样处理高并发 编辑:程序博客网 时间:2024/04/29 05:30
 

一、创建一个线程     

  HANDLE CreateThread(    LPSECURITY_ATTRIBUTES lpThreadAttributes,    SIZE_T dwStackSize,    LPTHREAD_START_ROUTINE lpStartAddress,    LPVOID lpParameter,    DWORD dwCreationFlags,    LPDWORD lpThreadId  );
   参数1:指向SECURITY_ATTRIBUTES结构体的指针。这里可以设置为NULL,使用缺省的安全性。
   参数2:指定初始提交的栈的大小,以字节为单位。系统会将这个值四舍五入为最近的页面。
         (页面:是系统管理内存时使用的内存单位,不同的CPU其页面大小也是不同的。X86
           使用的页面大小是4KB。当保留地址空间的一个区域时,系统要确保该区域的大小是
           系统的页面大小的倍数)
         如果该值是0或者小于缺省提交大小,则使用和调用线程一样的大小。
   参数3:指向LPTHREAD_START_ROUTINE(应用程序定义的函数类型)的指针。这个函数将被线程
         执行,表示了线程的起始地址。看线程入口函数ThreadProc。
   参数4:指定传递给线程的单独的参数的值。
   参数5:指定控制线程创建的附加标记。如果CREATE_SUSPENDED标记被指定,线程创建后处于暂停
         状态不会运行,直到调用了ResumeThread函数。
         如果该值是0,线程在创建之后立即运行。
   参数6:[out]指向一个变量用来接收线程的标识符。创建一个线程时,系统会为线程分配一个ID号。
         Windows NT/2000:如果这个参数是NULL,线程的标识符不会返回。
         Windows 95/98  :这个参数不能是NULL  
   如果函数执行成功,返回新线程的句柄。
二、编写线程函数
   可参考ThreadProc:    
   DWORD WINAPI ThreadProc(    LPVOID lpParameter   );
   
   类型和参数要匹配,函数名任意。
三、关闭线程句柄
   BOOL CloseHandle(    HANDLE hObject   );
   
   注意:关闭句柄并没有终止新创建的线程。只是表示对新创建的线程的引用不敢兴趣,系统会递减新
        线程的线程内核对象的使用计数。当使用计数为0的时候,系统就会释放线程内核对象。如果
        在主线程中没有关闭线程的句柄,始终都会保留一个引用。这样线程内核对象的引用计数就不会
        为0。即使新线程执行完毕,线程内核对象也不会被释放,只有等到进程终止的时候系统才会为
        残留的对象做清理工作。所以应该在不再使用线程的句柄的时候将其关闭掉,让线程的线程内核
        对象的引用计数减1。
四、暂停线程的执行
   
   当线程暂停执行的时候,也就是表示它放弃了执行的权力。操作系统会从等待运行的线程队列中选择
   一个线程来运行。新创建的线程就可以得到运行的机会。
   
   可以使用函数Sleep:
   
   void Sleep(     DWORD dwMilliseconds //sleep time 以毫秒为单位   );
   暂停当前线程指定时间间隔的执行。
五、中止线程的运行
(1)线程函数返回(最好使用这种方法)。这是确保所有线程资源被正确地清除的唯一办法。如果线程能够返回,就可以确保下列事项的实现:•在线程函数中创建的所有C++对象均将通过它们的撤消函数正确地撤消。•操作系统将正确地释放线程堆栈使用的内存。•系统将线程的退出代码设置为线程函数的返回值。•系统将递减线程内核对象的使用计数。(2)调用ExitThread函数(最好不要使用这种方法)。该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,C++资源(如C++类
对象)将不被撤消。(3)调用TerminateThread函数(应该避免使用这种方法)。TerminateThread能撤消任何线程。线程的内核对象的使用计数也被递减。TerminateThread函数是异步
运行的函数。如果要确切地知道该线程已经终止运行,必须调用WaitForSingleObject或者类似的函数。
当使用返回或调用ExitThread的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用TerminateThread,
那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。(4)包含线程的进程终止运行(应该避免使用这种方法)。由于整个进程已经被关闭,进程使用的所有资源肯定已被清除。就像从每个剩余的线程调用TerminateThread
一样。这意味着正确的应用程序清除没有发生,即C++对象撤消函数没有被调用,数据没有转至磁盘等等。一旦线程不再运行,系统中就没有别的线程能够处理该线程的句柄。然而别的线程可以调用GetExitcodeThread
来检查由hThread标识的线程是否已经终止运行。如果它已经终止运行,则确定它的退出代码。
原创粉丝点击