线程在运行过程之中,如何设置其域变量(10)

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

delphihou

Unregistered / Unconfirmed
GUEST, unregistred user!
线程在运行过程之中,如何设置其域变量,是否应该在线程挂起后再设置域变量,然后再唤醒,这样做妥当些呢?
 
不太明白你的意思,你想做什么呢?
 
Tthreadwork = class(Tthread) private Fusername:string;
Fuserpsw:string;在同一个单元内的其他类中,这样向线程中传参数 for i := 0 to Flist.Count - 1do
begin
//Tthreadwork(Flist.Items).Suspend ;
//增加挂起 Tthreadwork(Flist.Items).SetThreadNewUser(myuser,mypass);
//Tthreadwork(Flist.Items).Resume ;
//增加唤醒 end;
function Tthreadwork.SetThreadNewUser(myuser, mypass:string):boolean;
begin
self.Fusername := myuser;
self.Fuserpsw := mypass;
end;
这个挂起和唤醒,是必须的吗?
 
只要线程存在,就可以直接对其变量赋值,不用将其挂起了再操作,不过要注意并发的问题
 
那请稍加举例,何为并发问题,多谢。
 
像你用一个for循环对变量进行读写的,应该不会出现并发问题,但如果同时有多个线程对这两个变量进行读写,这样可能会出现并发问题了,比如有一个线程对self.Fusername 进行赋值,在此线程未对Fuserpsw进行赋值的时候,cpu时间片切换到了第二个线程,此线程恰好正在对self.Fuserpsw进行赋值,在第二个线程完成了赋值后,cpu时间片切换到了第三个线程,这时候就出现问题了,因为此线程读取到的是第一个线程的Fusername和第二个线程的Fuserpsw,所以要对这样的情况进行控制,要保证数据一致性。
 
接受答案了.
 
后退
顶部