es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  ,

Answer

  1. Avatar for 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ón AtomicCmpExchange no está optimizada correctamente, lo que resulta en una comparación incorrecta de los valores de FKey y LCompareKey.

    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.

Comments are closed.