Win32线程基础知识 总结,希望能有所指正。

Hiiishe 2008-10-09 12:04:23
刚才读完了《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()将伪句柄转化实句柄,此函数同样适用于进程句柄。
...全文
315 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hiiishe 2008-10-10
  • 打赏
  • 举报
回复
我一直以为任何方式引用NULL指针就会出错。
原来如此。长了见识。
感谢cnzdgs,nooning,以及各位热心同仁。
cnzdgs 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Jcily 的回复:]
奇怪,既然this已经NULL了,那如何又能进入GetSafeHandle中呢了?
比如pBrush->GetSafeHandle(),如果pBrush是NULL,此时已经是非法的引用了,那还何谈进入GetSafeHandle中的NULL判断,如何理解???
[/Quote]
对象指针是作为参数传递给函数的,调用时并不检查对象指针是否有效,只有在访问类的成员变量时才会遇到问题。你可以自己写段代码试试。
gellf 2008-10-10
  • 打赏
  • 举报
回复
汗颜,伪句柄和寄存器还真没理解透。

MARK
nooning 2008-10-10
  • 打赏
  • 举报
回复
((A*)null)->b();
nooning 2008-10-10
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 Jcily 的回复:]
引用 17 楼 cnzdgs 的回复:
引用 15 楼 Jcily 的回复:
"这类函数会检查当前对象指针是否为空",诸如GetSafeHandle,是静态成员函数?

不是静态函数,检查的是this指针。
if (this == NULL) return NULL;


奇怪,既然this已经NULL了,那如何又能进入GetSafeHandle中呢了?
比如pBrush->GetSafeHandle(),如果pBrush是NULL,此时已经是非法的引用了,那还何谈进入GetSafeHandle中的NULL判断,如何理解???
[/Quote]

pBrush->GetSafeHandle() 是thiscall 过程是这样的

mov ecx,[this]
call GetSafeHandle

所以你可以看到 this可以是任意值,函数本身是一定的。
你说的非法仅指引用内存。
比如引用一个实例的一个变量时,你才会得到非法的提示


例如
class A{
int x;
public b(){
//if (this!=null)
x=1; //这行会引起异常
}

}
A a;
a.b();
Formular1 2008-10-09
  • 打赏
  • 举报
回复
关键是例子。 
Hiiishe 2008-10-09
  • 打赏
  • 举报
回复
哪位同仁能详尽的解释一下伪句柄,,发现MFC很多类都有GetSafeHandle的函数,这里句柄有了一个Safe的含义。why?
wltg2001 2008-10-09
  • 打赏
  • 举报
回复
如果再加上线程同步就更好了。
lizhigang34 2008-10-09
  • 打赏
  • 举报
回复
支持楼主
不过,觉得这些似乎都是Jeffry Richter的话..
sys0002 2008-10-09
  • 打赏
  • 举报
回复
UP
dbger 2008-10-09
  • 打赏
  • 举报
回复
学习
walkbywind 2008-10-09
  • 打赏
  • 举报
回复
支持一下
sanshao27 2008-10-09
  • 打赏
  • 举报
回复
这是本好书
scq2099yt 2008-10-09
  • 打赏
  • 举报
回复
up
闪破风浪 2008-10-09
  • 打赏
  • 举报
回复
努力前行~
Hiiishe 2008-10-09
  • 打赏
  • 举报
回复
to lizhigang34
确实都是学习Jeffry R的观点,
Gary@Tokyo 2008-10-09
  • 打赏
  • 举报
回复
mark一下,看完JJHOOUR的《深入浅出MFC》 再看这书
kitcaii 2008-10-09
  • 打赏
  • 举报
回复
学习了,能搞点例子吗
zhinangren 2008-10-09
  • 打赏
  • 举报
回复
有例子更好吧!
zhinangren 2008-10-09
  • 打赏
  • 举报
回复
有例子更好吧!
加载更多回复(7)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧