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

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

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

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

var
WaitSQlite:Integer;//SQLITE 写入互斥锁 Function GetWaitSQlite:Boolean;//取得锁资源
begin
Result:=False;
//LOG.WriteLog('进入等待');
while InterlockedCompareExchange(WaitSQlite,,)=WaitSQlite do
begin
Sleep();
end;
Result:=True;
// LOG.WriteLog('0000000000000000000000000离开等待');
end;
Function FreeWaitSQlite:Boolean; //释放锁资源
begin
InterlockedCompareExchange(WaitSQlite,,) ;
// 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 实现主线程维一锁等待的更多相关文章

  1. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  2. Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息

    MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...

  3. Qt中暂停线程的执行(主线程和工作线程共用一把锁,一旦主线程将它锁上,工作线程就无法运行了,这也是一个办法)

    在线程中定义一个信号量: QMutex pause; 把run()函数中循环执行的部分用信号量pause锁住:   void run()   {   while(1)   {   pause.lock ...

  4. windows主线程等待子线程退出卡死问题

    在windows下调用_beginthread创建子线程并获得子线程id(函数返回值),如果子线程很快退出,在主线程中调用WaitForSingleObject等待该线程id退出,会导致主线程卡死.需 ...

  5. Java主线程等待子线程、线程池

    public class TestThread extends Thread { public void run() { System.out.println(this.getName() + &qu ...

  6. Python开发【笔记】:关于子线程(子进程)与主线程(主进程)的关联

    前言: 主要分析下面的问题: 主线程启线程  主线程执行完毕,会关闭子线程吗? 子线程启线程  主线程执行完毕,会结束吗? 主进程启动进程,主进程执行完毕,会怎样? 子进程启动进程,进程执行完毕,又会 ...

  7. Java并发编程原理与实战六:主线程等待子线程解决方案

    本文将研究的是主线程等待所有子线程执行完成之后再继续往下执行的解决方案 public class TestThread extends Thread { public void run() { Sys ...

  8. python主线程与子线程的结束顺序

    引用自 主线程退出对子线程的影响--YuanLi 的一段话: 对于程序来说,如果主进程在子进程还未结束时就已经退出,那么Linux内核会将子进程的父进程ID改为1(也就是init进程),当子进程结束后 ...

  9. 2018-10-31-WPF-在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待

    title author date CreateTime categories WPF 在触摸线程等待主线程窗口关闭会让主线程和触摸线程相互等待 lindexi 2018-10-31 9:30:9 + ...

随机推荐

  1. 壁虎书3 Classification

    MNIST fetch_openml returns the unsorted MNIST dataset, whereas fetch_mldata() returned the dataset s ...

  2. Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.

    运行代码时,一直报错: 经过查询后才知道,vue模板只能有一个跟对象 我是这样写的 最后修改为 就可以正常运行了

  3. 使用Xilinx UART-LITE IP实现串口--逻辑代码实现

    `timescale 1ns / 1ps /////////////////////////////////////////////////////////////////////////////// ...

  4. [Day19]Collection接口中的子类(List集合、Set集合)

    1.List接口 1.1API总结 (1)是一个元素存取有序的集合 (2)是一个带有索引的集合,通过索引可以精确的操作集合中的元素 (3)集合中有可以重复的元素,通过元素的equals方法,来比较是否 ...

  5. PPTPD 服务搭建

    查看系统发行版 uname -a 安装pptpd 服务 apt-get -y install ppp pptpd 配置 PPTPD 文件 vim /etc/pptpd.conf #去掉注释 local ...

  6. Asp.net 使用线程池实例

    实际开发经常会使用线程,如果每次使用都是创建线程.启动线程,然后销毁线程,从性能上来讲,非常占用系统开销,当线程达到一定量的时候会影响程序的运行和处理效率. 使用线程池:好处:线程池是一种多线程处理形 ...

  7. Docker 私有仓库建立(加密和用户验证)

    (一)生成证书1.mkdir /certs2.cd /certs 3.生成自签名证书 sudo openssl req -newkey rsa:2048 -new -nodes -x509 -days ...

  8. JMS笔记(三)

    最近重看activemq,对消息的传送确认机制有了进一步认识 1. mq在确认consumer收到消息后才会删除消息,因此consumer接收消息后应该进行ack"确认",java ...

  9. vs2017无法安装

    vs2017无法安装,无错误提示和日志 参考:https://blog.csdn.net/jq0123/article/details/83987686 但是解决方法不一样,运行安装程序没有提示,需要 ...

  10. E. Neko and Flashback

    传送门: 题意:假定我们已知a[]={3,4,6,5,7},  那么b[]通过min(a[i],a[i+1])得到 那么b[]={3,4,5,5}, c[]通过max(a[i],a[i+1])得到 c ...