初始化互斥锁

从源代码可以看到,SQlite在win32下的锁,用的是系统中的临界区,且全部为二元临界区,一把锁,即是一个互斥锁,故本文开头也时常说是互斥体,如有不妥,纯属无知,还请见谅。

SQlite总共有六个临界区,每把锁有各自用途,但纯粹从mutex_w32.c这个文件来看,无法分析每把锁的具体用途,以至于对图SQLite锁的状态以及状态的转换(见2.2锁的流程)产生误读,因为单纯从mutex_w32.c这个角度来看,无法构造出每个步骤的锁的转换流程,就如同低维生物无法理解高维世界,底层只提供调用方式,管中窥豹,无法窥见程序全貌。锁的状态以及状态的转换,具体对应代码实现应该是在os_win.c。

互斥锁初始化如下

    static int winMutexInit(void){
      /* The first to increment to 1 does actual initialization */
    //  PVOID *Destination,
    //  PVOID Exchange,
    //     PVOID Compera
    if( InterlockedCompareExchange(&winMutex_lock, 1, 0)==0 ){//2元临界区 一次只进一个
        int i;
        for(i=0; i<ArraySize(winMutex_staticMutexes); i++){
    #if SQLITE_OS_WINRT
          InitializeCriticalSectionEx(&winMutex_staticMutexes[i].mutex, 0, 0);  //OS_WINRT 系统才有
    #else
          InitializeCriticalSection(&winMutex_staticMutexes[i].mutex);//初始化6个临界区
    #endif
        }
        winMutex_isInit = 1;//初始化完成后赋值1
      }else{
        /* Someone else is in the process of initing the static mutexes */
        while( !winMutex_isInit ){
          sqlite3_win32_sleep(1);//2元临界区,进不了的睡觉
        }
      }
      return SQLITE_OK;
    }

results matching ""

    No results matching ""