首页 > 其他分享 >读写锁

读写锁

时间:2023-04-17 18:38:27浏览次数:24  
标签:begin end 读写 TSynReadWrite FLock FEvent procedure

unit SynReadWrite;

interface

uses
Windows, Classes, SysUtils, NJaContainers;

type
TSynReadWrite = class(TObject)
private
FCurReadCount: Integer;
FLock: TSyncObject;
FEvent: THandle;
public
constructor Create;
destructor Destroy; override;

procedure ReadLock;
procedure ReadUnlock;
procedure WriteLock;
procedure WriteUnlock;
end;

implementation

{ TSynReadWrite }

constructor TSynReadWrite.Create;
begin
inherited;

FCurReadCount := 0;
FLock := TSyncObject.Create;
FLock.ThreadSafe := True;

// 手动Reset,即Wait完毕不自动Reset,默认状态:set
FEvent := CreateEvent(nil, True, True, nil);
end;

destructor TSynReadWrite.Destroy;
begin
CloseHandle(FEvent);
FreeAndNil(FLock);

inherited;
end;

procedure TSynReadWrite.ReadLock;
begin
FLock.Lock;
InterlockedIncrement(FCurReadCount);
FLock.Unlock;
end;

procedure TSynReadWrite.ReadUnlock;
begin
// 通知读完毕
if InterlockedDecrement(FCurReadCount) = 0 then
SetEvent(FEvent);
end;

procedure TSynReadWrite.WriteLock;
var
LCurCount: Integer;
begin
// 让读写都不能再进入
FLock.Lock;
// 事件:要等待读完毕
ResetEvent(FEvent);
LCurCount := FCurReadCount;
if LCurCount > 0 then
begin
// 有正在读取的
WaitForSingleObject(FEvent, INFINITE);
end;
end;

procedure TSynReadWrite.WriteUnlock;
begin
FLock.Unlock;
end;

end.

标签:begin,end,读写,TSynReadWrite,FLock,FEvent,procedure
From: https://blog.51cto.com/u_16076050/6195818

相关文章

  • C#指针读写结构体,效率高
    fixed(int*p1=&point.x){fixed(double*p2=&arr[5]){//Dosomethingwithp1andp2.}}fixed语句禁止垃圾回收器重定位可移动的变量。fixed语句只能出现在不安全的上下文中。Fixed还可用于创建固定大小的缓冲区。fixed语句设置指向托管变量的指针,并在执......
  • C#在文件读写结构体 Marshal效率低
    usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Runtime.InteropServices;name......
  • 15.Proxysql读写分离搭建
    Proxysql读写分离搭建1)环境准备这里分别准备四台虚拟机,192.168.10.129(server_id:1293306) 192.168.10.130(server_id:1303306) 192.168.10.131(server_id:1313306) 192.168.10.132,192.168.10.129~131这三台都装好mysql服务端,且配置好主从复制,我这里主库是12......
  • C-文件读写
    文件读写#include<stdio.h>读取文件FILE*fopen(char*filename,char*mode);参数说明:打开方式说明"r"以只读方式打开文件.文件必须存在,否则打开失败."w"以写入方式打开文件.如果文件不存在,那么创建一个新文件;如果文件存在,那么清空文件内容.......
  • 【FPGA】 DDR读写
    前两个礼拜搞来一个用MIGIP核读写的DDR的程序本来已经能够跑起来了。今天试了下,init_calib_complete信号一直拉不高,看了半天才知道是仿真时间不够。记录一下init_calib_complete拉高的时间点110us左右,省的下次继续走弯路。(输入时钟频率为100MHz,复位信号拉高)重新回顾了一......
  • Android 短视频和图片无读写权限TargetApi>=29解决方案
    一、背景        目前很多公司在适配API29,也就是targetSdkVersion=29的权限适配。不仅是权限的适配,还有政策的要求。目前就有很多大公司已收到工信部要求,不给读写权限:android.permission.WRITE_EXTERNAL_STORAGE和android.permission.READ_EXTERNAL_STORAGE      ......
  • #yyds干货盘点#Python读写文件脚本
    该脚本根据输入的路径,可以读取路径下的所有文件,实现匹配字符串替换,添加内容和删除内容的功能。importosfromfileinputimportFileInput#删除内容defmatch_then_delete(inputpath):forroot,dirs,filesinos.walk(inputpath):forfileinfiles:......
  • 项目实现读写分离
    一、数据库环境准备(主从复制)直接使用在虚拟机中搭建的主从复制的数据库环境即可在主库中导入项目的业务数据库reggie并导入相关表结构和数据。二、在项目中加入Sharding-JDBC实现读写分离步骤1、导入Maven坐标2、在配置文件中配置读写分离规则3、在配置文件中配置允许bean定......
  • 读写分离案例
    背景:面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改......
  • 读写分离——Mysql主从复制
    问题说明:读和写所有压力都由一台数据库承担,压力大,数据库服务器磁盘损坏则数据丢失,单点故障写操作——insert、update、delete——》Master主库——数据同步——》Slave从库《——读操作——Mysql主从复制  Mys......