程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 高效讀寫鎖,Delphi讀寫鎖

Delphi 高效讀寫鎖,Delphi讀寫鎖

編輯:Delphi

Delphi 高效讀寫鎖,Delphi讀寫鎖


本人設計了一個高效讀寫鎖,可實現多個線程讀一個線程寫的鎖,應該比Delphi自帶的讀寫鎖高效,本人沒有做對比測試。

本文的鎖不可以在一個線程裡重入,否則會鎖死,另外讀寫鎖最多支持65535個線程同時讀。

//HeZiHang@cnblogs
//跨平台簡易高效鎖

unit uLocker;

interface

type
  //多讀單寫鎖
  //1.寫的時候阻塞其他所有寫和讀
  //2.讀的時候不阻塞其他讀,但阻塞所有寫,當阻塞了一個或以上的寫後,將阻塞所有後來新的讀
  TMultiReadSingleWriteLocker = class
    FLocker: Integer;
    procedure LockRead;
    procedure UnLockRead;
    procedure LockWrite;
    procedure UnLockWrite;
    function TryLockRead:Boolean;
    function TryLockWrite:Boolean;
    constructor Create;
  end;

  TSimpleLocker=class
    FLocker:Integer;
    procedure Lock;
    procedure UnLock;
    function TryLock:Boolean;
  end;

implementation

uses System.SyncObjs, System.SysUtils;

{ TMultiReadSingleWriteLocker }

procedure TMultiReadSingleWriteLocker.LockWrite;
begin
  if TInterLocked.Add(FLocker, $10000) <> $10000 then
  begin
    while (TInterLocked.Add(FLocker, 0) and $FFFF) <> $10000 do
      Sleep(0);
  end;
end;

function TMultiReadSingleWriteLocker.TryLockRead: Boolean;
begin
  Result:=TInterLocked.Increment(FLocker) and $FFFF0000 =0;
  if not Result then
     TInterLocked.Decrement(FLocker)
end;

function TMultiReadSingleWriteLocker.TryLockWrite: Boolean;
begin
  Result:=TInterLocked.Add(FLocker, $10000) = $10000;
end;

procedure TMultiReadSingleWriteLocker.UnLockWrite;
begin
  TInterLocked.Add(FLocker, -$10000);
end;

procedure TMultiReadSingleWriteLocker.UnLockRead;
begin
    TInterLocked.Decrement(FLocker);
end;

constructor TMultiReadSingleWriteLocker.Create;
begin
  FLocker:=0;
end;

procedure TMultiReadSingleWriteLocker.LockRead;
begin
  if TInterLocked.Increment(FLocker) and $FFFF0000 <> 0 then
  begin
    while TInterLocked.Add(FLocker, 0) and $FFFF0000 <> 0 do
      Sleep(0);
  end;
end;

{ TSimpleLocker }

procedure TSimpleLocker.Lock;
begin
  while TInterLocked.CompareExchange(FLocker, 1, 0)<>0 do
    Sleep(0);
end;

function TSimpleLocker.TryLock: Boolean;
begin
  Result:= TInterLocked.CompareExchange(FLocker, 1, 0)=0;
end;

procedure TSimpleLocker.UnLock;
begin
  TInterLocked.CompareExchange(FLocker, 0, 1);
end;

end.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved