New variants of Scalable RWLocks

New variants of Scalable RWLocks version 5.1

Author: Amine Moulay Ramdane

Email: aminer68@gmail.com

Description:

Here are my inventions of a fast, and scalable and starvation-free and fair and lightweight Multiple-Readers-Exclusive-Writer Lock called LW_RWLockX, the scalable LW_RWLockX does spin-wait, and of a fast and scalable and starvation-free and fair Multiple-Readers-Exclusive-Writer Lock called RWLockX, the scalable RWLockX doesn't spin-wait but uses my portable SemaMonitor and portable event objects , so it is energy efficient.

The parameter of the constructors is the size of the array of the readers , so if the size of the array is equal to the number of parallel readers, so it will be scalable, but if the number of readers are greater than the size of the array , you will start to have contention, please look at the source code of my scalable algorithms to understand.

And i have included two units that are called MREWEx and LighweightMREWEx that include TMultiReadExclusiveWriteSynchronizer and TLightweightMREW classes that are scalable and starvation-free and fair since they are using my Scalable RWLocks that are starvation-free and fair, also BeginRead() and BeginWrite() of LightweightMREWEx and MREWEx are reentrant (recursive), so in other words, if a thread already called BeginWrite(), it can call BeginWrite() again and it will succeed and it will not deadlock, and the same applies to BeginRead(), please take a look at them inside the source code of my units.

I have also used my following implementation of FNV1a hash function to make my new variants of RWLocks scalable (since FNV1a is a hash algorithm that has good dispersion):

function FNV1aHash(key:int64): UInt64;

var

i: Integer;

key1:uint64;

const

FNV_offset_basis: UInt64 = 14695981039346656037;

FNV_prime: UInt64 = 1099511628211;

begin

//FNV-1a hash

Result := FNV_offset_basis;

for i := 1 to 8 do

begin

key1:=(key shr ((i-1)*8)) and $00000000000000ff;

Result := (Result xor key1) * FNV_prime;

end;

end;


You can go to download the zip files by clicking on the following web link:

https://drive.google.com/drive/folders/1kOP3jKIUhF7vfFPfP8_t56OjA-DAw2Zu?usp=sharing

Language: FPC Pascal v2.2.0+ / Delphi 5+: http://www.freepascal.org/

Operating Systems: Win , Linux (x86).

Required FPC switches: -O3 -Sd

-Sd for delphi mode....

Required Delphi switches: -$H+

You can configure it as follows from inside defines.inc file:

{$DEFINE CPU32} and {$DEFINE Windows32} for 32 bit systems

{$DEFINE CPU64} and {$DEFINE Windows64} for 64 bit systems