Me pregunto si el siguiente (pseudo) código es seguro de usar. Sé acerca de la bandera Terminated, pero necesito establecer algún tipo de indicador de cancelación en la operación de búsqueda recursiva desde el hilo principal y mantener el thread worker en funcionamiento. Comprobaré allí también la propiedad Terminated, lo que falta en este pseudo código.¿Es seguro establecer el valor booleano en el hilo desde otro?
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;
¿Es seguro para establecer la propiedad booleana FCancel en el interior de la rosca de esta manera? ¿No colisionaría esto con la lectura de esta bandera en el procedimiento de RecursiveSearch mientras se presiona el botón en la forma principal (hilo principal)? O tendré que agregar, p. sección crítica para leer y escribir este valor?
Muchas gracias
Si mal no recuerdo, una asignación entera es atómica y, por lo tanto, segura para hilos. – iamjoosy
Parece que duplicar la propiedad 'Terminated' ... debería ser seguro. – jpfollenius
Gracias a todos; El comentario de Smasher sobre la duplicación de propiedades terminadas es la mejor explicación. –