Delphi 高效读写锁

本人设计了一个高效读写锁,可实现多个线程读一个线程写的锁,应该比Delphi自带的读写锁高效,本人没有做对比测试。

本文的锁不可以在一个线程里重入,否则会锁死,另外读写锁最多支持65535个线程同时读。

//[email protected]
//跨平台简易高效锁

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.
时间: 2024-07-28 13:32:32

Delphi 高效读写锁的相关文章

读写锁————用互斥量和条件变量模拟

一. 读写锁 在多线程环境下为了防止对临界资源访问的冲突我们往往会在线程函数中加入互斥锁来完成线程间的互斥:但是,在有些情况下,互斥锁mutex并不是那么高效,比如当要对一块缓冲区进行读写操作的时候,因为读的需要比写入修改的需要要多,读取数据并不会修改缓冲区的数据个数或者内容,如果要使用互斥锁就会耗费额外的时间,每一次读取都要争夺锁资源挂起等待,因此就可以使用另外一种锁机制----读写锁. 有读写锁的存在当然就会有读者和写者,也就是多个线程,但是它们之间的相互关系和mutex锁中有所不同: 当读

浅析线程间通信二:读写锁和自旋锁

上文讨论了互斥量和条件变量用于线程的同步,本文将讨论读写锁和自旋锁的使用,并给出了相应的代码和注意事项,相关代码也可在我的github上下载. 读写锁 对于互斥量要么是锁住状态要么是不加锁锁状态,而且一次只有一个线程可以对其加锁,而读写锁对线程的读数据加锁请求和写数据加锁请求进行了区分,从而在某些情况下,程序有更高的并发性.对于读写锁,一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁.虽然读写锁的实现各不相同,但当读写锁处于读模式锁住状态时,如果有另外的线程试图以写

自旋锁,读写锁和顺序锁的实现原理

常用的同步原语锁,到多核处理器时代锁已经是必不可少的同步方式之一了.无论设计多优秀的多线程数据结构,都避不开有竞争的临界区,此时高效的锁显得至关重要.锁的颗粒度是框架/程序设计者所关注的,当然越细越好(也不尽然),同时不同的锁往往也会体现出完全不同的效率,Linux有posix的pthread_mutex_t,Windows有CreateMutex创造的HANDLE,boost有mutex而且C++11也定义了std::mutex,这些锁在获取不到锁时都会进入睡眠状态(try_lock方法例外)

Java并发程序设计(15)并发锁之读写锁(续二)写锁降级

1.1.1. 读写锁应用之三写锁降级 ReentrantReadWriteLock还具有写锁降级的特点,而这跟可重入性有一些关系. (1)持有写锁时可以降级为读锁. (2)持有读锁时不能升级为写锁. ReentrantReadWriteLock和ReentrantLock相似的是都有一个特点,就是可重入.可重入指已经获取到锁的线程可以再次获取锁,保证lock和unlock的次数相同即可. package com.test.concurrence; import java.util.Random;

ReentrantReadWriteLock读写锁的使用2

本文可作为传智播客<张孝祥-Java多线程与并发库高级应用>的学习笔记. 这一节我们做一个缓存系统. 在读本节前 请先阅读 ReentrantReadWriteLock读写锁的使用1 第一版 public class CacheDemo { private Map<String, Object> cache = new HashMap<String, Object>(); public static void main(String[] args) { CacheDem

深入浅出 Java Concurrency (13): 锁机制 part 8 读写锁 (ReentrantReadWriteLock) (1)[转]

从这一节开始介绍锁里面的最后一个工具:读写锁(ReadWriteLock). ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念.前面的章节中一直在强调这个特点.显然这个特点在一定程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何“读/读”,“写/读”,“写/写”操作都不能同时发生.但是同样需要强调的一个概念是,锁是有一定的开销的,当并发比较大的时候,锁的开销就比较客观了.所以如果可能的话就尽量少用锁,非要用锁的话就尝试看能

锁,同步,可重入锁,读写锁(转)

1.synchronized 把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility). 1.1 原子性 原子性意味着个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护.从而防止多个线程在更新共享状态时相互冲突. 1.2 可见性 可见性则更为微妙,它要对付内存缓存和编译器优化的各种反常行为.它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 . 作用:

linux 读写锁应用实例

转自:http://blog.csdn.net/dsg333/article/details/22113489 /*使用读写锁实现四个线程读写一段程序的实例,共创建了四个新的线程,其中两个线程用来读取数据,另外两个线程用来写入数据.在任意时刻,如果有一个线程在写数据,将阻塞所有其他线程的任何操作.*/#include <errno.h>#include <pthread.h>#include <stdio.h>#include <stdlib.h>#incl

读写锁ReadWriteLock和缓存实例

读写锁:多个读锁不互斥,读锁与些锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥,因此读写锁可提高性能. 例子1:三个线程同时对一个共享数据进行读写. import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantRea