什么是线程同步? ( 积分: 30 )

  • 主题发起人 主题发起人 nq961
  • 开始时间 开始时间
N

nq961

Unregistered / Unconfirmed
GUEST, unregistred user!
在我编写的程序中用以下调用线程:
t:=mytthread.create(adoconnection1,listbox1);
t.Resume;
e:=mytthread.create(adoconnection2,listbox1);
e.Resume;
u:=mytthread.create(adoconnection3,listbox1);
u.Resume;
我用以上方法调用线程来对数据库填加数据,但有时能够全部填加成功,有时候数据填加的数据并不全,不是缺这个就是少那个,我该怎么办?是否一定用线程池呀?但我一点也不懂.
 
在我编写的程序中用以下调用线程:
t:=mytthread.create(adoconnection1,listbox1);
t.Resume;
e:=mytthread.create(adoconnection2,listbox1);
e.Resume;
u:=mytthread.create(adoconnection3,listbox1);
u.Resume;
我用以上方法调用线程来对数据库填加数据,但有时能够全部填加成功,有时候数据填加的数据并不全,不是缺这个就是少那个,我该怎么办?是否一定用线程池呀?但我一点也不懂.
 
就是线程同步的问题;
牵涉到多个线程同时对表修改是就要注意这点。线程不能同时修改表。
方法一:
首先。声明一个标示临界区的变量,如CS:TRTLCriticalSection;,然后调用initializecriticalsection(CS)初始化临界区。
然后,调用entercriticalsection(CS),那么之后的代码就只能由一个线程执行,知道调用leavecriticalsection(CS)
最后,调用deletecriticalsection(CS),释放资源
方法二:互斥变量
hmutex:=createmutex(nil,false,nil);
//创建一个互斥变量
if waitforsingleobject(hmutex,infinite)=wait_object_0 then
//永远等待互斥变量
begin
// 发信号
.............
end;
releasemutex(hmutex);//释放互斥变量,等待该互斥变量发信号的就可以执行了
 
如果你需要在线程中访问VCL资源,那么你用Synchronize(自定义过程);
就可以了~~~~~
 
后退
顶部