【发布时间】:2012-03-08 16:11:50
【问题描述】:
我想知道以下(伪)代码是否可以安全使用。我知道 Terminated 标志,但我需要在主线程的递归搜索操作中设置某种取消标志并保持工作线程运行。我还会在那里检查 Terminated 属性,这个伪代码中缺少什么。
type
TMyThread = class(TThread)
private
FCancel: Boolean;
procedure RecursiveSearch(const ItemID: Integer);
protected
procedure Execute; override;
public
procedure Cancel;
end;
procedure TMyThread.Cancel;
begin
FCancel := True;
end;
procedure TMyThread.Execute;
begin
RecursiveSearch(0);
end;
procedure TMyThread.RecursiveSearch(const ItemID: Integer);
begin
if not FCancel then
RecursiveSearch(ItemID);
end;
procedure TMainForm.ButtonCancelClick(Sender: TObject);
begin
MyThread.Cancel;
end;
以这种方式在线程内部设置布尔属性 FCancel 是否安全?当按下主窗体(主线程)中的按钮时,这不会与 RecursiveSearch 过程中读取此标志相冲突吗?或者我必须添加例如读取和写入此值的临界区?
非常感谢
【问题讨论】:
-
如果我没记错的话,整数赋值是原子的,因此是线程安全的。
-
看来你复制了
Terminated属性……不过应该是安全的。 -
谢谢大家; Smasher 关于复制 Terminated 属性的评论是最好的解释。
-
@iamjoosy 仅在对齐时
-
@David 通常是 IIRC。不过,打包记录可能是个例外。
标签: multithreading delphi thread-safety