浅尝《Windows核心编程》之线程创建、退出、暂停、恢复

1.线程的创建

线程的创建有多种方式,不过例如CreateThread之类的API不宜使用,因为C++ 运行库里面有一些函数使用了全局量,如果使用 CreateThread 的情况下使用这些C++ 运行库的函数,就会出现不安全的问题。而 _beginthreadex 为这些全局变量做了处理,使得每个线程都有一份独立全局量。所以绝对不要调用系统自带的CreateThread函数创建新的线程,而应该使用_beginthreadex,除非你在线程中绝不使用需要tiddata结构的运行时库函数”。

对于这句话,便友峰峰的理解是“需要用到Thread Local Storage的时候用CreateThread,不用的时候用_beginthreadex”。这个还有待考证。

(有位大哥为我们指点了迷津,具体的说法请见http://www.cnblogs.com/lgxqf/archive/2009/02/10/1387480.html

具体实例如下:

 

#include "windows.h"

unsigned __stdcall ThreadProc(
void * p)
{
   
//to do what you want;
   
// ..
   return 0;//the only correct and safe way to exit thread
}


HANDLE h1 
= (HANDLE)_beginthreadex(NULL,0,ThreadProc,NULL,NULL,NULL);

 

 

2.线程的退出

可以使用以下几种方法退出,不过只推荐第一种方法。

(1)线程函数返回。(能正常退出,而且通常不会出现资源泄漏)

       有一个利用等待和事件内核对象做到的多线程实例,请参看《浅尝<Windows核心编程>之线程退出实例》

(2)ExitThread函数。

       这个方法不能够在退出的时候释放c++资源(如c++类对象),不推荐是哦那个。

(3)TerminateThread函数。

       不同于ExitThread,它能够退出任何的线程(只要能够拿到线程句柄)。

(4)包含线程的进程终止运行。

 

3.线程的暂停

可以使用 SuspendedThread 函数来暂停线程。

不过通常不建议这样做,因为这样不是很安全,因为你不知道目前被suspend的那个线程跑到了什么程度,比如说如果它正好在访问某段内存,由于访问的互斥,它会将这段内存上锁,如果这个时候就suspend它,那么将无法再使用这段内存(写)。

 

4.线程的恢复

恢复线程,就是使它成为可调度的线程,可以使用 ResumeThread 函数。如果成功将会返回前一个暂停计数。

注意,如果一个线程暂停了3次,那么它必须恢复3次,然后它才能够可以被分配给一个CPU。 

posted @ 2009-06-05 23:54  aicro  阅读(1426)  评论(3编辑  收藏  举报