IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQLite学习之路⑩ 互斥锁(2021SC@SDUSC) -> 正文阅读

[大数据]SQLite学习之路⑩ 互斥锁(2021SC@SDUSC)

SQLite 学习之路 第十节 互斥锁


互斥锁部分由mutex.c、mutex_w32.c、mutex_unix.c和mutex_noop.c实现

mutex.c的头文件mutex.h如下所示

#ifdef SQLITE_MUTEX_OMIT
/*
** If this is a no-op implementation, implement everything as macros.
//宏定义了一系列的函数,需声明SQLITE_MUTEX_OMIT
*/
#define sqlite3_mutex_alloc(X)    ((sqlite3_mutex*)8)
#define sqlite3_mutex_free(X)
#define sqlite3_mutex_enter(X)
#define sqlite3_mutex_try(X)      SQLITE_OK
#define sqlite3_mutex_leave(X)
#define sqlite3_mutex_held(X)     ((void)(X),1)
#define sqlite3_mutex_notheld(X)  ((void)(X),1)
#define sqlite3MutexAlloc(X)      ((sqlite3_mutex*)8)
#define sqlite3MutexInit()        SQLITE_OK
#define sqlite3MutexEnd()
#define MUTEX_LOGIC(X)
#else
#define MUTEX_LOGIC(X)            X  //定义了SQLITE_DEBUG 才使用,防止调试时出错
#endif /* defined(SQLITE_MUTEX_OMIT) */

函数解释如下:
int sqlite3MutexInit(void) 初始化互斥体变量
int sqlite3MutexEnd(void) 关闭互斥系统。释放sqlite3MutexInit()分配的资源。调用结构体中xMutexEnd,返回RC
sqlite3_mutex *sqlite3_mutex_alloc(int id) 获取一个指向静态互斥锁或分配一个新的动态互斥锁。根据类型(id)分配新互斥锁
sqlite3_mutex *sqlite3MutexAlloc(int id) 功能同上
void sqlite3_mutex_free(sqlite3_mutex *p) 释放一个动态互斥锁
void sqlite3_mutex_enter(sqlite3_mutex *p) 获得互斥锁p。如果其他线程已经拥有互斥锁,那么就将其阻塞,直到它可以获得。
int sqlite3_mutex_try(sqlite3_mutex *p) 获得互斥锁p。如果成功,返回SQLITE_OK。否则,如果另一个线程持有互斥锁,它不能得到,就返回SQLITE_BUSY。
void sqlite3_mutex_leave(sqlite3_mutex *p) sqlite3_mutex_leave() 程序退出之前由相同的线程输入的互斥对象。如果一个空指针作为参数传递给该函数,那么就不做任何操作
int sqlite3_mutex_held(sqlite3_mutex *p) 调试状态P为0返回 xMutexHeld分配失败返回0 否则返回1
int sqlite3_mutex_notheld(sqlite3_mutex *p) P为0返回 xMutexHeld分配失败返回0, 否则返回1

互斥锁的初始化:

int sqlite3MutexInit(void){ 
  int rc = SQLITE_OK;
  if( !sqlite3GlobalConfig.mutex.xMutexAlloc ){
    /* If the xMutexAlloc method has not been set, then the user did not
    ** install a mutex implementation via sqlite3_config() prior to 
    ** sqlite3_initialize() being called. This block copies pointers to
    ** the default implementation into the sqlite3GlobalConfig structure.
    */
    sqlite3_mutex_methods const *pFrom;
    sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex;//保存互斥锁的使用接口
 
    if( sqlite3GlobalConfig.bCoreMutex ){
      pFrom = sqlite3DefaultMutex();//默认接口
    }else{
      pFrom = sqlite3NoopMutex();//不使用互斥锁,适用于单线程
    }
    pTo->xMutexInit = pFrom->xMutexInit;
    pTo->xMutexEnd = pFrom->xMutexEnd;
    pTo->xMutexFree = pFrom->xMutexFree;
    pTo->xMutexEnter = pFrom->xMutexEnter;
    pTo->xMutexTry = pFrom->xMutexTry;
    pTo->xMutexLeave = pFrom->xMutexLeave;
    pTo->xMutexHeld = pFrom->xMutexHeld;
    pTo->xMutexNotheld = pFrom->xMutexNotheld;
    sqlite3MemoryBarrier();//这是一个内存屏障,为了防止某些cpu指令的乱序执行
    pTo->xMutexAlloc = pFrom->xMutexAlloc;
  }
  assert( sqlite3GlobalConfig.mutex.xMutexInit );
  rc = sqlite3GlobalConfig.mutex.xMutexInit();
 
#ifdef SQLITE_DEBUG
  GLOBAL(int, mutexIsInit) = 1;
#endif
 
  return rc;
}

互斥体enter使用:
当一个线程想进入时,若另一个线程包含了互斥锁,就不能进入

void sqlite3_mutex_enter(sqlite3_mutex *p){
  if( p ){
    sqlite3GlobalConfig.mutex.xMutexEnter(p);//  void (*xMutexEnter)(sqlite3_mutex *);
  }
}

互斥体try使用:
企图进入一个互斥锁,sqlite3_mutex_enter()不被阻塞。互斥锁一旦成功键入,sqlite3_mutex_try()接口将返回一个标志位,这个标志位是 SQLITE_OK。

int sqlite3_mutex_try(sqlite3_mutex *p){
  int rc = SQLITE_OK;
  if( p ){
    return sqlite3GlobalConfig.mutex.xMutexTry(p);//  int (*xMutexTry)(sqlite3_mutex *);
  }
  return rc;
}
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:23:14  更:2021-11-29 16:24:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:33:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码