王朝网络
分享
 
 
 

[原创]Windows开发——进程与线程

王朝system·作者佚名  2006-01-31
宽屏版  字体: |||超大  

进程和线程

写在前,下面是我读Windows SDK的一些笔记,希望能与需要它的人一起分享。其中有些部分还未读完,我会尽快完善。

1创建线程

可用CreateThread创建一个线程,创建线程的时候必须指明新线程的执行地址,通常它的执行地址就是在程序代码内定义的函数的名称,这个函数只有一个参数,返回的是一个DWORD类型的值。一个进程可以有多个线程同时在执行相同的函数。

如果主建线程在新线程(子线程)前退出程序,那么传地址的方式传递局部变量给新线程就会存在风险,因为指针会变成无效的,所以必须等新线程退出后才能退出子线程。也可以用全局变量来传参数给新线程,但是这就要注意多线程的同步访问。但有的时候,在创建多线程时使用全局变量将不太方便。

对于CreateThread函数的参数,主建线程可以使用的参数有如下几个:

第一个:新线程的安全属性(security

attributes)。该属性表明一个子进程是否能够继承该新线程。安全属性也被系统用来在允许访问之前检查所有对这个线程的并发访问。

第二个:新线程的初始栈空间(initial

stack size)大小。线程的栈被自动分配在进程的内存空间内,系统在线程被创建时分配栈并在线程结束时释放栈。

第三个:创建标识(creation

flag)使你在挂起状态下创建这个线程。挂起后,直到ResumeThread函数被调用后线程才会被调用。

你也可以用CreateRemoteThread函数来创建一个线程。不过这个函数多用于调试进程在被调试的进程的地址空间内创建一个运行在该空间内的线程。

(2005-4-12)

2挂起线程的执行

通过使用SuspendThread和ResumeThread函数可以将一个线程挂起和激活执行。当一个线程被挂起后,处理器将不为它分配预定的时间。SuspendThread函数不适合用于线程的同步,因为它无法控制代码内,线程的执行在哪一点被挂起。

3多个线程的同步执行

为了避免竞争和死锁,多线程对共享资源的同步访问是有必要的。同步还确保相互以来的代码以合适的顺序执行。

有很多的对象可以用于同步多线程。这些对象包括:

控制输入缓冲区

事件互斥 进程

信号量线程计时器

这些对象中的一些常用于阻塞一个线程直到某个事件发生。例如,

其他的对象对于保护共享资源不被同时访问是非常有用的。例如,

对于一个单进程的多个线程,临界区(critical-section)对象提供的同步方法比互斥对象更有效。临界区可以像互斥对象一样,使得在某一个时间只有一个线程去使用受保护的资源。一个线程可以调用EnterCriticalSection函数来请求某个临界区的所有权。如果它正在被另一个线程使用,那么这个发起请求的线程被阻塞。一个线程也可以调用TryEnterCriticalSection函数来请求某个临界区的所有权,此时即使请求失败也不会被阻塞。在获得临界区所有权后,线程可以自由地使用受保护资源。该进程的其它线程如果不试图进入临界区,它们的执行就不会受到影响。

WaitForInputIdle函数使一个线程等待直到一个指定的进程被初始化并且等待用户输入一个确定的输入。调用WaitForInputIdle函数可以被用于同步的父进程和子进程,因为CreateProcess函数不用等到子进程完成初始化才返回。

4线程的局部存储

5中止一个线程

6线程安全和访问权限

Windows NT安全模式使你可以控制对线程对象的访问。当你调用CreateProcess, CreateProcessAsUser, CreateProcessWithLogonW,

CreateThread, 或者CreateRemoteThread函数时,你可以为一个线程指定一个安全描述符(security

descriptor)。如果你指定为NULL,该线程将得到一个默认的安全描述符。线程中的默认安全描述符的ACL是主要的或者是像创建者的标识(token)一样重要。

(2005-4-13)

GetSecurityInfo函数可用来获得某个线程的安全描述符,SetSecurityInfo函数可用来改变某个线程的安全描述符。

由CreateThread函数返回的句柄拥有THREAD_ALL_ACCESS的权限来访问那个线程对象。当你调用GetCurrentThread函数时,系统返回一个安全描述符允许的具有最小访问权限的伪句柄给调用者。

对线程对象合法的访问权限包括DELETE,READ_CONTROL,SYNCHRONIZE,WRITE_DAC,and WRITE_OWNER这些标准访问权限,此外,下面的是一些线程的特殊访问权限:

含义

SYNCHRONIZE

可以在任何的等待函数中使用线程句柄

THREAD_ALL_ACCESS

线程对象的所有可能访问权限

THREAD_DIRECT_IMPERSONATION

一个模仿客户的服务器线程所必须的

THREAD_GET_CONTEXT

使用GetThreadConttext读取某个线程的上下文时所必须的

THREAD_IMPERSONATE

Required to use a thread's security

information directly without calling it by using a communication mechanism

that provides impersonation services.

THREAD_QUERY_INFORMATION

从某个线程读取确定信息(例如退出代码,参看GetExitCodeThread函数)所必须的。

THREAD_SET_CONTEXT

使用SetThreadContext写一个线程的上下文时所必须的

THREAD_SET_INFORMATION

在线程对象中设置确定的信息时所必须的

THREAD_SET_THREAD_TOKEN

Required to set the impersonation token

for a thread using SetTokenInformation.

THREAD_SUSPEND_RESUME

挂起或激活一个线程时所必须的

THREAD_TERMINATE

使用TerminateThread函数中止一个线程时所必须的

如果想读或写一个线程对象的SACL(安全控制列表)时,你可以对该线程使用ACCESS_SYSTEM_SECURITY的访问权限。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有