mythread.OnTerminate:=ThreadDone; 过程ThreadDone中需要考虑线程安全吗?(50分)

  • 主题发起人 主题发起人 tianzhen
  • 开始时间 开始时间
T

tianzhen

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.ThreadDone(Sender: TObject);
begin
...
threadcount:=threadcount+1;//是否需要进临界区?
...
listbox1.items.delete(i);
//是否需要进临界区?
...
end;
 
好像不用临界区
 
不是好像,是不需要~~~
OnTerminate事件处理并不是作为线程的一部分运行,它是在主线程环境下运行。
 
谢谢楼上确定的答案,顺便问一下,线程的.create中需要考虑线程安全吗?
constructor mythread.create;
begin
inherited Create(false);
mythreadlist.LockList;
//需要吗?
mythreadlist.Add(self);
mythreadlist.UnlockList;
//需要吗?
end;
 
需要吗?不需要吗?需要。
因为你的其它线程有可能同时也在对mythreadlist进行操作。
 
难得遇到个明白人,最后再问一下就揭帖了,受累:
如果别处对mythreadlist都是Add操作,没有delete, 是不是可以不用(un)lock ?
 
需要,我觉得
 
需要的,(un)lock不仅仅是给add和delete操作的,还在for循环的时候需要锁,否则,本来一个for执行到一半,你delete所有的内容了,那不出异常才怪。呵呵。需要的。
 
一般来说,多线程中,“值”,好像也叫简单类型,都不需要临界区,如Integer,Byte,Boolean等等
“引用”都需要使用临界区,或者别的同步方式,防止一起对他操作发生冲突,比如类等等
 
不可以不用(un)lock,除非别处对于mythreadlist都只去读,不写(Add也是写)。
 
大家的意思就是说“ 线程的.create部分是在线程中执行的,而不是在主进程中执行。”吧?
没问题的话结帖了。
 
多人接受答案了。
 
后退
顶部