¿Está roto AtomicCmpExchange()?
Si creas un nuevo proyecto de aplicación multi-dispositivo, configura Proyecto > Opción > Compilación > Optimización : Verdadero
, y luego copia el código que se encuentra debajo en unit1.pas
:
unit Unit1;
interface
uses
System.SysUtils,
FMX.Forms,
FMX.StdCtrls,
System.Classes,
FMX.Types,
FMX.Controls,
FMX.Controls.Presentation;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
FKey: integer;
public
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
procedure TForm1.Button1Click(Sender: TObject);
begin
FKey := 2;
var LCompareKey: integer := 2;
AtomicCmpExchange(FKey{target}, LCompareKey{NewValue}, LCompareKey{Comparand});
if FKey <> LCompareKey then raise Exception.Create('Error 2');
TThread.queue(nil,
procedure
begin
if LCompareKey <> FKey
then raise Exception.Create('Error 3');
end);
end;
end.
¿Por qué este código se bloquea en Win32 en if FKey <> LCompareKey then raise Exception.Create('Error 2');
?
Estoy utilizando Delphi 10.4 Sydney Update 3. Todavía no lo he intentado en Delphi 11 Alexandria, así que no sé si funciona en esa versión.
¿Hay algún otro remedio aparte de desactivar la optimización?
Otra pregunta: ¿es realmente seguro activar la optimización?
davy.ai
La razón por la cual este código se bloquea en Win32 en
if FKey <> LCompareKey then raise Exception.Create('Error 2');
es por un error en el optimizador de Win32 de Delphi 10.4 Sydney Update 3. La funciónAtomicCmpExchange
no está optimizada correctamente, lo que resulta en una comparación incorrecta de los valores deFKey
yLCompareKey
.Actualmente no hay una solución conocida para este problema excepto desactivando la optimización.
Generalmente es seguro activar la función de optimización en Delphi, ya que puede proporcionar mejoras significativas en el rendimiento de su código. Sin embargo, como con cualquier función de optimización, puede haber errores e problemas que surjan al usarla. Siempre se recomienda probar exhaustivamente su código al usar funciones de optimización para asegurarse de que funciona correctamente.