请教:(delphi)数据库的多线程访问问题(50分)

  • 主题发起人 主题发起人 luckylady
  • 开始时间 开始时间
L

luckylady

Unregistered / Unconfirmed
GUEST, unregistred user!
一个数据库table1,用两个线程mythread1和mythread2同时访问(查
询修改等操作)。线程中使用了以下类似的语句:
with table1do
first;
for i:=1 to n1do
next;
for i :=1 to n2do
begin
edit;
fieldbyname('s').asstring:=w;
post;
next;
end;
运行后出现同步问题。怎样解决?听说需要使用siss...属性,那位大
虾能帖个例程?我的水平很低,刚来“大富豪”,分数不多,还望多多关
照,在下有礼了!
 
请高手出招。
 
你这两个线程都是做什么用的?看你的程序没看明白。
 
线程中不要直接对VCL操作,对数据库操作也要注意锁定的问题。
简单的方法是定义一个全局boolean变量,当一个线程操作数据库的时候,
把这个值设置成TRUE,别的线程在操作数据库前,先判断这个值,如果是TRUE
就一直等待。
线程和数据库结合是很麻烦的问题,我也头大。
有经验的朋友可以相互探讨。
 
操作系统的课程上有,是用临界区的。你可以看看书。
另外,DELPHI中有这种函数,你可以看看“DELPHI编程技术内幕”
 
TO CRAB “你这两个线程都是做什么用的?”
我给的程序是个例子,就是运行两个线程同时对一个数据库进行修改操作。
TO Woodstock“线程和数据库结合是很麻烦的问题,我也头大。”
很难吗?有可能实现吗?我是否应该放弃?请指教。
“定义一个全局boolean变量,当一个线程操作数据库的时候,
把这个值设置成TRUE,别的线程在操作数据库前,先判断这个值,如果是TRUE
就一直等待。”好主意!只是牺牲了多线程的高效率特性。但我还是
要试一试,谢谢!
To qf0421“操作系统的课程上有,是用临界区的。你可以看看书。
另外,DELPHI中有这种函数,你可以看看“DELPHI编程技术内幕””
临界区?谈谈看。delphi中的函数名是什么?我没有“内幕”教材,那里能下载吗?谢谢!
联接“大富豪”十分十分困难。多稿一投,望凉。
 
写线程程序一般执行这样的操作都用Synchronize括起来,可以避免一些问题。
但是这样也是牺牲效率的。好象没有别的好办法了。
 
如果仅仅锁定当前处理的一个记录,则对总效率影响不大。请问:在多线程数据库
访问中怎样在一个线程中锁定一个记录比可以对其操作,而拒绝其他线程访问该
记录?最好给个例程。
 
线程的同步问题,WOODSTOCK说的可以试试看
 
搞定!!
 
Synchronize函数
 
为什么不参看Delphi5自带例子“BKQuery”呢?
 
我也在做相似的程序,我后台开了四个线程(对后台数据表写),前台开了6个线程
(4个对后台数据表读,两个写),搞了很多天了,总体还可以,不过我在不断改进
因为我得程序拿到现场调试了,不能贴给你,不过大致有两个重点:
1。为每个线程分配一个session
2.线程execute部分多用sleep函数,这个函数比较安全。
当然,还有线程的suspend 和 resume 等问题,希望和你多多交流
我得信箱:xzhengy@263.net
 
我觉得这与线程关系不大只要你处理好table的访问允许多用户访问,即可在线程处理时注意
及时的更新数据集就行了,我没结合过.不过我觉得没问题
 
我在数据库版里贴过了
----
嘿嘿,我也做过这样的事情,但是没问题.
在线程里添加数据库,要注意几点.
1.当一个线程接收完毕,开始添加时,要设置一个排斥的信号量(或设置临界区),以使得其
它线程即使完成接收也无法马上进行数据库操作,而是先挂起等待当前操作线程完毕后才可进
行自己的操作.当然如果你是每个线程一个数据库Connection,我也没话说(好浪费阿,)也容易出
问题,绝对不推荐使用!
2.那就是这个挂起其它线程也是很有讲究的,比如一个线程接受完毕,要进行数据库操作时,
发现当前系统处于临界状态,那么一般的做法是把线程挂起一断时间(比如sleep(50)),然后从试,
不这样,你的程序的CPU USEAGE就会是嘿嘿100%,恐怖.另外进行操作的主线程在进入临界区后
,也最好先sleep一会,这样会大大降低程序的CPU USEAGE.另外还有一个问题就是,如果你的线
程在检测到系统处于临界状态后都sleep同样的时间(比如50ms),那很容易造成某几个线程老是
独占数据库连接而其它的线程饿死的状态.如果你学过操作系统理论,一定会有理解.Unix系统
采用的办法是根据等待的时间,不断提高线程的优先级别,但是这样比较麻烦.有个较简单的办法.
知道CSMA/CD么?(不知道也不要紧)他采取的办法是让一个线程等待一段随机的时间,然后在
从试的办法,这样就可以基本解决这里的某些线程饿死的问题(当然CSMA/CD比这复杂的多,它还有
什么10次回推的手段,这里没必要搞的这么复杂).也就是让它sleep一个随机值,这个随机值的
选取,我自己认为,可以以一次Delphi的ADO数据库Insert操作的时间值为参考,在几分之一次
标准操作到几次标准操作的时间左右随机,具体可以通过试验来确定.这样即可以避免线程饿死,
又可以大大降低系统Cpu占用率,也使程序的效率不因为线程的挂起而降低.
希望对你有帮助
----
另外想说一下.Synchronize函数是用于VCL的线程安全的,这里应该用自己写的信号量或者
delphi本身提供的临界区功能,来完成锁定工作.
 
你是用的什么样的数据库呀。要具体的具体分析。
 
操作系统书中用 p(s), v(s) 实现进程间的互斥与通讯
先 p(s)申请操作权限;
执行操作;
再 v(s)释放权限;
p(s)
begin

if (s=0)
then
s=1
else
sleep;
end
v(s)
begin

s=0;

end
 
多人接受答案了。
 
后退
顶部