2017-04-22 3 views
11

Delphi 10.2 (Linux 지원)에는 Windows InterlocekdEchange와 동일한 크로스 플랫폼 함수 AtomicExchange가 있습니다. 지금까지 그렇게 좋았습니다 ...Delphi 10.2를 사용하는 Linux 용 InterlockedExchangeAdd와 같습니다.

AtomicExchangeAdd가없는 InterlockedExchangeAdd를 사용하여 Win32 코드를 이식해야합니다.

내 질문은 : Linux 용으로 컴파일 할 때 InterlockedExchangeAdd를 바꾸려면 무엇을 사용할 수 있습니까?

+0

http://stackoverflow.com/q/2287451/505088 –

답변

10

InterlockedExchangeAdd()는 "값 의 원 부가 가치가가산 할 가리키는 행한다. 결과는 가산 할 의해 지정된 어드레스에 기억된다."

가 서로 정수 값을 증가 :

System.SyncObjs 유닛은 동일한 작업을 수행하는 방법을 Add() 오버 한 TInterlocked 클래스를 갖는다.

두 가지 오버로드 된 Add 메서드가 있습니다. Add 메서드는 모두 Target에 의해 Increment까지 증가합니다.

class function Add(var Target: Integer; Increment: Integer): Integer; overload; static; inline; 

class function Add(var Target: Int64; Increment: Int64): Int64; overload; static; inline; 

차는 TInterlocked.Add() 반면 대신의 "증가 파라미터의 값을 반환"InterlockedExchangeAdd()는 "변수 곁에 가산 할 가리키는 초기 값을 반환"이다.

function InterlockedExchangeAdd(var Addend: Integer; Value: Integer): Integer; 
begin 
    Result := TInterlocked.Add(Addend, Value) - Value; 
end; 
+0

이 정말 연동되어 (원자) : 당신이 반환 값을 사용한다면, 당신은 예를 들면, 그 차이를 설명 할 것인가? 그건 그렇고, TInterlocked는 AtomicXYZ 함수를 감싸는 래퍼 일뿐입니다. – fpiette

+0

@fpiette 네, 래퍼가 있지만, 그것은 또한 원자 적 연산을위한 공개 크로스 플랫폼 인터페이스입니다. –

+1

'AtomicIncrement' 등은 공용 플랫폼이기도합니다. 둘 중 하나를 선택할 수 있습니다. –

11

System.SysUtils.pas이 함수의 숨겨진 구현이있다 :

function AtomicExchangeAdd(var Addend: Integer; Value: Integer): Integer; 
begin 
    Result := AtomicIncrement(Addend, Value) - Value; 
end; 

그것은 사실의 사용을 만드는 가산 할의 새 값을 반환AtomicIncrement, 동안 InterlockedExchangeAdd은 이전 값을 반환합니다. 값인을 빼면 예상 된 결과를 얻을 수 있으며 분명히 스레드로부터 안전합니다.