• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

假定有一个需求,在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
      HOMQServer.FDQuerySQLiteExec.Connection:=FDConSQLite;
      HOMQServer.FDQuerySQLiteExec.close;
      HOMQServer.FDQuerySQLiteExec.Sql.clear;
      HOMQServer.FDQuerySQLiteExec.Sql.text := Sql;
      HOMQServer.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;不然界面会被卡死。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
SIR模型实现(matlab)发布时间:2022-07-18
下一篇:
matlab获取路径名并且按顺序赋值给另一个文件夹里面的文件发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap