delphi 利用 InterlockedCompareExchange 实现主线程维一锁等待

摘要:
当锁定资源时,线程通常会相互作用。很少需要在主线程中锁定资源。然而,在一些复杂的业务中,当子线程和主线程之间存在交互,并且一些资源在主线程中被同步使用时,主线程资源锁是必要的。假设有一个需求,即当SQLITE被更新时,需要一个通用的更新组件来减少资源创建和释放以及相应的内存回收的需求。此时,有必要锁定并更新每个更新。别胡说了,只要代码。

在进行资源锁定时,一般是线程之间进行交互,很少需要在主线程也对资源进行锁定。

   不过在一些复杂的业务中,存在子线程与主线程的交互,且一些资源也同步在主线程中使用时,主线程资源锁,就有存在的必要。

假定有一个需求,在SQLITE更新时,需要共同一个更新组件,以减少资源建立与释放及相对应内存回收的需求,则此时的每一个更新,就有先锁定再更新的必要。

废话不多说,直接上代码。

var
    WaitSQlite:Integer;//SQLITE 写入互斥锁

Function  GetWaitSQlite:Boolean;//取得锁资源
begin
  Result:=False;
 //LOG.WriteLog('进入等待');
 while    InterlockedCompareExchange(WaitSQlite,1,0)=WaitSQlite do
 begin
     Sleep(1);
 end;
  Result:=True;
  // LOG.WriteLog('0000000000000000000000000离开等待');
end;
Function  FreeWaitSQlite:Boolean; //释放锁资源
begin
   InterlockedCompareExchange(WaitSQlite,0,1) ;
 //  LOG.WriteLog('1111111111111111111111111释放等待');
end;
function EXECLocalSQLite(Sql: string): Boolean;
begin
  Result := False;
GetWaitSQlite;
  try
    try
      FDQuerySQLiteExec.Connection:=FDConSQLite;
      FDQuerySQLiteExec.close;
      FDQuerySQLiteExec.Sql.clear;
      FDQuerySQLiteExec.Sql.text := Sql;
      FDQuerySQLiteExec.EXECSQL;
    except
      on E: Exception do
      begin
        LOG.WriteLog(Sql);
        LOG.WriteLog('EXECLocalSQLite 执行SQL报错:' + E.Message);
      end;
    end;
  finally
   FreeWaitSQlite
  end;
end;
GetWaitSQlite在 WaitSQlite 值为1时,会一直循环等待,直接该值为0,然后调用  InterlockedCompareExchange (该函数是一个粒度很小的锁控制,因此不担心并行修改问题)把值修改为1,

后返回,执行对应的SQL,执行完后,把该值修改为0,供下一次调用。
如果是EXE中运行,记得加上    Application.ProcessMessages;不然界面会被卡死。

免责声明:文章转载自《delphi 利用 InterlockedCompareExchange 实现主线程维一锁等待》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇动态加载与插件系统的初步实现(3):WinForm示例C++11 并发指南四(<future> 详解二 std::packaged_task 介绍)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

delphi NativeXml的中文支持 乱码

一般XML的编码格式设置成UTF8比较通用,下面演示使用UTF8编码方式存储和处理包含中文的XML字符串(文件)。1.设置启用内置的widestring支持NativeXml内部使用ANSI string和UTF8编码的string两种字符串类型。如果要让NativeXml能够解析widestring字符串的话,直接将TNativeXml的Utf8Enc...

深入解析synchronized

深入解析synchronized 1 常见的几个并发问题 1.可见性问题 案例演示:一个线程根据boolean类型的标记flag, while循环,另一个线程改变这个flag变量的值,另一个线程并不会停止循环。 /** * @author WGR * @create 2020/12/22 -- 20:18 */ public class Test01...

C# Thread线程介绍

一、基本概念 1、进程 首先打开任务管理器,查看当前运行的进程: 从任务管理器里面可以看到当前所有正在运行的进程。那么究竟什么是进程呢? 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。一个正在运行的应用程序在操作系统中被视为一个进程,进程可以包括一个或多个线程。线程是操作系统分配处理器时间的基本单元,在进程...

Delphi MDI子窗体

用MDI实现浏览子窗口,具有窗口管理功能,同屏观看多个网页的内容① 多文档窗体(MDI)MDI窗体是一种具有主子结构的窗体体系,微软的Word便是其中的一个典型例子。MDI体系中至少需要两种窗体,只能将其中之一设置为主窗体,其余窗体全部则全部为子窗体,主窗体负责子窗体的管理、切换等工作。自然,子窗体上承载的内容可各不相同。Tidy浏览器最终实现了三种不同的...

python并发编程:阻塞IO

阻塞IO(blocking  IO) 在Linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:   当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的udp包),这个时候kernel...

java多线程 -- ConcurrentHashMap 锁分段 机制

hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能。 ConcurrentHashMap 同步容器类是Java 5 增加的一个线程安全的哈希表。对 与多线程的操作,介于 HashMap 与 Hashtable 之间。内...