2017-04-22 14 views
11

Delphi 10.2 (có hỗ trợ cho Linux) có chức năng Nền tảng chéo AtomicExchange tương đương với Windows InterlocekdEchange. Cho đến nay rất tốt ...Tương đương với InterlockedExchangeAdd cho Linux bằng Delphi 10.2)

Tôi phải sử dụng mã Win32 sử dụng InterlockedExchangeAdd không có tương đương AtomicExchangeAdd.

Câu hỏi của tôi là: Tôi có thể sử dụng cái gì để thay thế InterlockedExchangeAdd khi biên dịch cho Linux?

+0

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

Trả lời

10

InterlockedExchangeAdd() "thực hiện một sự bổ sung nguyên tử của Value với giá trị được trỏ đến bởi phụ chú. Kết quả được lưu trữ trong các địa chỉ theo quy định của phụ chú."

Đơn vị System.SyncObjs có một lớp TInterlocked, mà đã quá tải Add() phương pháp để làm điều tương tự:

gia số một giá trị số nguyên với nhau.

Có hai phương thức quá tải Add. Cả hai phương thức Add đều tăng Target bởi 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; 

Sự khác biệt là InterlockedExchangeAdd() "trả về giá trị ban đầu của biến được trỏ đến bởi phụ chú", trong khi TInterlocked.Add() "trả về giá trị của tham số tăng lên" để thay thế. Vì vậy, nếu bạn sử dụng giá trị trả về, bạn sẽ phải giải thích cho sự khác biệt đó, ví dụ:

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

Đây có phải là thực sự đan cài (nguyên tử)? Nhân tiện, TInterlocked chỉ là một trình bao bọc xung quanh chức năng AtomicXYZ. – fpiette

+0

@fpiette có, nó ks một wrapper, nhưng nó cũng là một giao diện đa nền tảng công cộng cho các hoạt động nguyên tử. –

+1

'AtomicIncrement' vv cũng là nền tảng công khai. Bạn có thể chọn một trong hai. –

11

Có một thực hiện ẩn của chức năng này trong System.SysUtils.pas:

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

Nó làm cho việc sử dụng thực tế là AtomicIncrement trả về giá trị mới của phụ chú, trong khi InterlockedExchangeAdd trả về giá trị cũ. Trừ Giá trị cho kết quả mong muốn và rõ ràng là an toàn chỉ.

Các vấn đề liên quan