您的位置:首页 > 其它

WIN32线程的基础知识 总结

2008-10-09 20:22 267 查看
2008.10.08
《Windows核心编程》第6章—线程的基础知识 学习总结

在WIN32中,进程是线程的容器,每个进程至少拥有一个主线程。进程包括两部分:进程内核对象和地址空间。
同样,线程也包括两部分:线程的内核对象和线程堆栈。
线程的主要使用在辅助计算方面,使长时间的计算不影响用户界面。
线程必须有个进入点函数,如WIN32应用程序的主线程的进入点函数就是main()或WinMain()等.

一般WIN32辅助线程的进入点函数为如下形式:
DWORD WINAPI ThreadFunc(PVOID pvParam)
{
DWORD dwResult = 0;
...
return(dwResult);
}

函数CreateThread()参数简介:
HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa, // 指定安全的结构指针,一般可以NULL,bInheritHandle成员指定句柄是否可以继承
DWORD cbStack, // 指定线程堆栈空间的大小
PTHREAD_START_ROUTINE pfnStartAddr, // 指定线程入口点函数地址
PVOID pvParam, // 传递给线程函数的参数
DWORD fdwCreate, // 一般为0,立即执行线程函数
PDWORD pdwThreadID); // 指定线程ID,一般就0

线程的终止的方法有:线程函数的返回,调用ExitThread(),调用TerminateThread()。但是,终止线程运行的最佳方法是让它的线程函数返回。这样才尽可能保证某些资源能正常释放。

WIN32线程的性质。线程的内核对象中包含了:一组CPU寄存器,包括SP线程堆栈寄存器,IP指令指针寄存器等;其他属性,如使用计数,暂停计数,返回码等。
其中指令寄存器IP存放的是BaseThreadStart()函数地址,这样在CreateThread调用后,线程函数的执行是在BaseThreadStart()函数中调用的。

C/C++运行期库的考虑。由于部分C运行期函数并没有考虑线程安全性,所以在多线程应用程序中使用C/C++运行库函数时,要考虑尽量使用_beginthreadex()创建线程,当然项目属性要设置链接到多线程DLL版本的C/C + +运行期库。

线程的伪句柄。GetCurrentProcess()和GetCurrentThread()返回的都是伪句柄,伪句柄在这里暂时理解为无法在其他线程中使用成功,意思是如果在A线程中用上面函数得到了句柄,再传递给B线程中进行前的线程的操作(如改A的优先级等)是不成功的,操作前需要使用函数DuplicateHandle()将伪句柄转化实句柄,此函数同样适用于进程句柄。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: