阅读:3969回复:10
请问 Vxd是多线程的吗?
我的意思是,当Vxd正在处理一个消息时,新到来的消息是不是必须等待,还是由VXD派生新的Vxd,来处理新消息?
谢了 |
|
沙发#
发布于:2001-08-28 16:07
Vxd支持多线程,当Vxd如果不是中断调用时,对线程的处理是完全支持的.当Vxd正在处理一个消息时,新到来的消息必须等待,直到原消息已处理完毕.这与WINDOWS系统的处理是完全一致的.
|
|
|
板凳#
发布于:2001-08-28 19:55
还是不很明白。
举个例子,假如Vxd在消息A的处理过程中因为Wait信号量C而阻塞, 此时消息B到来(假设Vxd对消息B的处理是Signal信号量C),如果如上所说,Vxd不是派生一个新线程,而是将消息B的处理延迟到A处理结束以后。但由于Vxd阻塞在A的处理过程中,消息B就永远的不到处理机会,Vxd于是就死锁了。这样好像不对吧? |
|
地板#
发布于:2001-08-30 18:27
VXD的线程是由调用它的进程继承过来的,如果是同一个线程不可能产生你说的情况,如果是两个线程同时调用同一个VXD,就有了一个线程的优先极问题,在这种情况下(即当消息A要等待消息B的结果),系统会临时提升线程(消息B)的优先级,从而保证系统正常工作。
|
|
地下室#
发布于:2001-08-30 20:01
谢谢你的回答。
我昨天已经做过测试了,确实是这么回事。 好像对于不同的消息,VXD都会派生线程来进行处理。只是最好不要在处理同步IO请求时进行等待,会死机的,呵呵 |
|
6楼#
发布于:2001-09-04 10:39
VXD本身仅有限支持多线程。 线程不是随意被切换的。
共有2个调度器能决定谁被调度。 1.VMM的PRIMARY SCHEDULE。 他会每20ms评估线程优先并且当情况允许时切换线程。 2.KERNEL32有个线程调度器。 他检查WIN32运行状态, 同样能够决定哪个线程被调度。 只有当2个调度器都同意时线程才会被切换。 通常在VXD里尝试改变线程调度很容易导致死锁。 所以尽量不要在RING0干这些活。 |
|
|
7楼#
发布于:2001-09-05 20:03
这么急呀?!呵呵
这样吧,一人一半好了。^-^ |
|
8楼#
发布于:2001-09-05 20:08
怎么找不到给分菜单呢?奇怪!!!
|
|
9楼#
发布于:2001-09-06 15:43
[QUOTE]原本由 txftxf 发表
[B]这么急呀?!呵呵 这样吧,一人一半好了。^-^ [/B][/QUOTE] 开个玩笑罢了 |
|
10楼#
发布于:2001-09-08 20:05
但我还是找不到给分菜单?真菜呀
|
|