高手请进,ISAPI 怎样保护全局变量?(200分)

  • 主题发起人 主题发起人 dengjoy
  • 开始时间 开始时间
D

dengjoy

Unregistered / Unconfirmed
GUEST, unregistred user!
在ISAPI中定义的变量的值,怎样不被其他连接破坏?
IsMultithread := true和
threadvar 和
var
i:^integer;
都没有用!!!
如果用线程互斥,我怕效率太低.
 
既然是全局变量,那当然是要给大家访问的了,怎么能说被别人破坏?
最多说要“避免同时访问(写入)”
 
如果是不能给别人访问的,那就不要用全局变量了
 
Pipi. 有道理!
 
可是我即使用private亦无用!
 
要“避免同时访问(写入)”
-----不会的,可以象unix一样
加入一个公共信号值i来控制竞争:

初始化为
i:=1;

在处理你的全局变量时,加入这样一段代码
1)i:=i-1;
2)if i<0 then
挂起-wait;
3)处理全局变量;
4)i:=i+1;

 
g622,你那个同步方式真是糟糕,在并发高的多线程中没有用处。

private和 public 没有什么区别,关键你放哪里了
 
我想有两种方法.
1,通过私有的属性,比如tag等携带.
2,并发处理,我想线程互斥比较安全.
 
这可是我在unix里的常用手段。
 
???看不太懂

但是提供一个方法:
首先保存一个TLIST类的东西保存指针
声明一个类:TVAR保存你需要的变量
每当调用一次时,生成一个ID ,生成一个TVAR的实例,并将TVAR指针保存起来
看得明白吗?

方法挺苯,我想好象可以完全解决你的问题吧?而且实现起来并不太麻烦。
 
没有办法。

没有太好的办法。

用临界区或者互斥来解决同步。

已经没有更多的方法了。

另外,如果用临界区的话,效率会比互斥高,但临界区没有超时检测,所以
可能一个isapi的线程会进入死锁。

我与M$的技术工程师谈过这个问题,没有更多的解决方案。对于临界区导致
死锁的问题,他们也知道,但不会修改。

W2K中的临界区有超时值设置,但是操作系统全程的,而不是针对一个进程/应用
的。所以并不好用。 :(~~~~~~
 
多人接受答案了。
 
netwind下课!这个问题是怎么结束的?!误导消费者啊!
netwind下课!netwind下课!netwind下课!netwind下课! :(

----------------------------------------------------------------
pipi.-100分。他的回答是这样的:
1. 既然是全局变量,那当然是要给大家访问的了,怎么能说被别人破坏?
最多说要“避免同时访问(写入)”
2. 如果是不能给别人访问的,那就不要用全局变量了
3. g622,你那个同步方式真是糟糕,在并发高的多线程中没有用处。
private和 public 没有什么区别,关键你放哪里了
第一个回答试图纠正概念错。其实当一个变量(内存地址)被两个线程同时访问时,其中
一个读取了值,试图修改,而同时另一个线程已经写入了新的修改值。这种情况理解为
变量被破坏是无尝不可的。在多线程中,这叫冲突。
第二个回答无价值。
第三个回答前半部分我基本同意。后半部分是错的。——谁敢说没有区别?!回家再去
读读OOP!前半部分的回答有些问题,g622用的方式是线程同步中的“设置标志量”,其
实也是M$所谓的一种正常方法,没有什么不可以用的,只是效率太差。

----------------------------------------------------------------
wwwsys-50分。他的回答是这样的:
我想有两种方法.
1,通过私有的属性,比如tag等携带.
2,并发处理,我想线程互斥比较安全.
第一种:不明白。定义成私有变量就不会被破坏了,定义成TWebModule的一个类
属性也成的。
第二种。没错。互斥是使用低效率来保障安全性的方法,但,别无它法。

----------------------------------------------------------------
g622-50。他的回答是使用信号量(标志量)来达到同步。是一个正确有效的方法。

====================================================================
g622-50多少也算提供了一种正确的方法,应该100分。pipi最多算参与讨论而已嘛!

其实这个问题很简单。在ISAPI中,每一个请求打开一个ISAPI线程,如果定义成threadvar,
就不会被其它连接破坏了。如果还要想安全的话,可以定义成TWebModule的一个类
属性。但要注意的是,由于ISAPI的上一次请求的线程状态被保存,所以需要在开始
使用它时重置变量。
如果你想将变量定义成全局的,所有的连接请求都能够访问,那么为了避免冲突。你
应该使用同步。基本思路可以参见我在上面一个贴子中的答案。
有关多线程同步的技术可以参见机械工业出版社今年五月出的《Windows核心编程》。
---------------------------------------------------------------------------
netwind下课!netwind下课!netwind下课!netwind下课! :(
netwind下课!netwind下课!netwind下课!netwind下课! :(
netwind下课!netwind下课!netwind下课!netwind下课! :(
netwind下课!netwind下课!netwind下课!netwind下课! :(

还是不下课吧。要不这个版就没人管了,不过你也得有点儿专业精神啊! ^-^
 
我喜欢有人提不同意见。
其实,我只是知道在unix里是这么做的,正确的答案我也想知道。
aimingoo是个好同志,但也要为netwind想一想,好多没有人管的贴子啊,这里需要热心的人。
分数是小事,向大家学习。
我的oicq:8252170,与各位大侠为武心情不错。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
746
import
I
S
回复
0
查看
928
SUNSTONE的Delphi笔记
S
后退
顶部