利用SetHandleinformation方法可以随时修改内核对象句柄的一些属性,目前公开的句柄属性有两种,一种是该句柄是否能被继承,另一种是该句柄是否能被关闭。
1 .5.2同名共享
同名共享,不需要共享进程之间存在父子关系。但局限于内核对象是否支持这种共享方式。创建内核对象的Create函数中是否包含pszName是该内核对象是否支持同名共享的标志。
l 方法一:当Process1通过CreateObject(…”someName”)创建了一个名字为someName的内核对象后,Process2也调用了CreateObject(…”someName”),此时内核的动作是:在全局中查询发现已经存在someName1的对象;为Process2的句柄表添加一条Ojbect的记录,使用的句柄不确定;为someName这个Object的引用计数器加1。
l 方法二:Process2使用OpenObject(…”someName”)的方式来获得对名someName的Object的句柄。用这种Open方法的时候,需要提供一个参数让OS鉴权,以判定是否能够以参数指定的方式来访问内核对象。
1 .5.3复制内核对象的句柄的方式共享
跨进程边界的内核对象共享的另外一个方法是通过DuplicateHandle来复制内核对象句柄。
如果要将ProcessS中的对象拷贝到ProcessT中则调用DuplicateHandle的进程一定要有对这两个进程的访问权,即句柄表中拥有这两个进程内核对象的句柄记录。
2 线程的一般概念2 .1视图
l 进程只是线程的容器,从来不执行任何东西
l 线程总是在某个进程中被创建
l 线程在进程的地址空间中执行代码
l 线程们共享进程中的所有内核对象
3 线程的创建
HANDLE CreateThread(
PSECURITY_ATTRIBUTES psa,
DWORD cbStack,
PTHREAD_START_ROUTINE pfnStartAddr,
PVOID pvParam,
DWORD fdwCreate,
PDWORD pdwThreadID);
《Windows核心编程》P124介绍说应当使用编译器提供的线程创建函数,而不应当直接使用CreateThread。
3 .1CreateThread调用的内核行为
调用CreateThread后,OS进行如下几个动作:
l 生成一个线程内核对象
l 在进程空间内为线程分配堆栈空间
因为线程的环境同于其所在进程的环境,所以创建的线程可以访问进程中的所有资源,包括线程中所有的内核对象。
4 线程销亡4 .1终止线程的方式:
l 线程函数返回(最好使用这个方式,可以保证:线程种创建的C++对象正常析构;OS释放线程堆栈内存;OS将线程的退出码设置为线程函数的返回值;系统将递减该线程内核对象的的使用计数器【如果此时还有其他引用……,见下面说明】。)
l 调用ExitThread(不能释放C++对象,所以最好不要使用这个方式。windows多线程编程另外,如果非要调用也应当调用编译器推荐的,如_endThread【Windows核心编程P127】)
l 同进程内的其他线程(包括主线程)调用TerminateThread(被撤销线程得不到通知,不能释放资源,尽量避免这种方式。另外这个函数是个异步函数,返回时,线程不保证已经被撤销,如果要观察线程是否被撤销,应当使用WaitForSingleObject)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49700-2.html