欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

swoole鎖的機(jī)制代碼實(shí)例講解

 更新時(shí)間:2021年03月04日 10:14:20   作者:assasinSteven  
這篇文章主要介紹了swoole鎖的機(jī)制代碼實(shí)例講解,對(duì)于鎖的介紹講解的很清晰,有感興趣的同學(xué)可以學(xué)習(xí)下

鎖,這個(gè)詞我們并不陌生,主要的應(yīng)用場(chǎng)景會(huì)發(fā)生在高并發(fā)下進(jìn)行鎖。今天的這篇文章咱們主要來講解一下swoole的鎖的機(jī)制,swoole_lock是如何實(shí)現(xiàn)的。

swoole_lock類支持5種鎖的類型:

  • 文件鎖 SWOOLE_FILELOCK
  • 讀寫鎖 SWOOLE_RWLOCK
  • 信號(hào)量 SWOOLE_SEM
  • 互斥鎖 SWOOLE_MUTEX
  • 自旋鎖 SWOOLE_SPINLOCK

創(chuàng)建這些鎖的過程其實(shí)就是調(diào)用構(gòu)造函數(shù)的過程,調(diào)用的形式如下:

swoole_lock->__construct(int $type, [string $lockfile])

$type為鎖的類型

$lockfile,當(dāng)類型為SWOOLE_FILELOCK時(shí)必須傳入,指定文件鎖的路徑

下面我們介紹下這個(gè)鎖的實(shí)現(xiàn)

static PHP_METHOD(swoole_lock, __construct)
{
    long type = SW_MUTEX;
    char *filelock;
    zend_size_t filelock_len = 0;
    int ret;
    //解析輸入?yún)?shù),這里輸入?yún)?shù)有2個(gè),其中type表示鎖的類型,另外個(gè)參數(shù)是文件鎖時(shí)必須傳入(表示文件鎖對(duì)應(yīng)的文件路徑),其他鎖時(shí),不需要這個(gè)參數(shù)
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &type, &filelock, &filelock_len) == FAILURE)
    {
        RETURN_FALSE;
    }
    //從內(nèi)存池申請(qǐng)鎖對(duì)象空間,這里僅僅是申請(qǐng)鎖空間
    swLock *lock = SwooleG.memory_pool->alloc(SwooleG.memory_pool, sizeof(swLock));
    if (lock == NULL)//申請(qǐng)空間失敗
    {
        zend_throw_exception(swoole_exception_class_entry_ptr, "global memory allocation failure.", SW_ERROR_MALLOC_FAIL TSRMLS_CC);
        RETURN_FALSE;
    }
 
    switch(type)//按type遍歷,創(chuàng)建鎖對(duì)象
    {
#ifdef HAVE_RWLOCK
    case SW_RWLOCK://如果是讀寫鎖
        ret = swRWLock_create(lock, 1);//創(chuàng)建鎖對(duì)象,類型為讀寫鎖
        break;
#endif
    case SW_FILELOCK://如果是文件鎖
        if (filelock_len <= 0)//第二個(gè)參數(shù)有效性檢查
        {
            zend_throw_exception(swoole_exception_class_entry_ptr, "filelock requires file name of the lock.", SW_ERROR_INVALID_PARAMS TSRMLS_CC);
            RETURN_FALSE;
        }
        int fd;
        if ((fd = open(filelock, O_RDWR | O_CREAT, 0666)) < 0) //調(diào)用linux函數(shù)open,打開文件(不存在則創(chuàng)建)
        {
            zend_throw_exception_ex(swoole_exception_class_entry_ptr, errno TSRMLS_CC, "open file[%s] failed. Error: %s [%d]", filelock, strerror(errno), errno);
            RETURN_FALSE;
        }
        ret = swFileLock_create(lock, fd);//創(chuàng)建鎖對(duì)象,類型為文件鎖
        break;
    case SW_SEM:
        ret = swSem_create(lock, IPC_PRIVATE);//創(chuàng)建鎖對(duì)象,類型為信號(hào)量
        break;
#ifdef HAVE_SPINLOCK
    case SW_SPINLOCK:
        ret = swSpinLock_create(lock, 1);//創(chuàng)建鎖對(duì)象,類型為樂觀鎖
        break;
#endif
    case SW_MUTEX:
    default:
        ret = swMutex_create(lock, 1);//創(chuàng)建鎖對(duì)象,類型為互斥量
        break;
    }
    if (ret < 0)
    {
        zend_throw_exception(swoole_exception_class_entry_ptr, "failed to create lock.", errno TSRMLS_CC);
        RETURN_FALSE;
    }
    swoole_set_object(getThis(), lock);//PHP側(cè)的對(duì)象和swoole內(nèi)部對(duì)象關(guān)聯(lián)
    RETURN_TRUE;
}

以下分別介紹下各個(gè)不同鎖對(duì)象的創(chuàng)建過程。

1、讀寫鎖

int swRWLock_create(swLock *lock, int use_in_process)
{
    int ret;
    bzero(lock, sizeof(swLock));//鎖空間初始化
    lock->type = SW_RWLOCK;//設(shè)置鎖的類型為讀寫鎖
    pthread_rwlockattr_init(&lock->object.rwlock.attr);//linux函數(shù),鎖屬性信息初始化
    if (use_in_process == 1)//標(biāo)記為在進(jìn)程中使用,這里pthread開頭的linux函數(shù)默認(rèn)都是針對(duì)線程的
    {
        //設(shè)置鎖的屬性信息,標(biāo)記為在進(jìn)程中使用
        pthread_rwlockattr_setpshared(&lock->object.rwlock.attr, PTHREAD_PROCESS_SHARED);
    }
 
    if ((ret = pthread_rwlock_init(&lock->object.rwlock._lock, &lock->object.rwlock.attr)) < 0)//linux函數(shù),鎖信息初始化
    {
        return SW_ERR;
    }
 
    /*
     * 設(shè)置鎖的回調(diào)函數(shù)
     */
    lock->lock_rd = swRWLock_lock_rd;
    lock->lock = swRWLock_lock_rw;
    lock->unlock = swRWLock_unlock;
    lock->trylock = swRWLock_trylock_rw;
    lock->trylock_rd = swRWLock_trylock_rd;
    lock->free = swRWLock_free;
    return SW_OK;
}
 
 

2、文件鎖。

int swFileLock_create(swLock *lock, int fd)
{
    bzero(lock, sizeof(swLock));//鎖對(duì)象信息初始化
    lock->type = SW_FILELOCK;//設(shè)置鎖的類型為文件鎖
 
    /*
     * 設(shè)置鎖的回調(diào)函數(shù)
     */
    lock->object.filelock.fd = fd;
    lock->lock_rd = swFileLock_lock_rd;
    lock->lock = swFileLock_lock_rw;
    lock->trylock_rd = swFileLock_trylock_rd;
    lock->trylock = swFileLock_trylock_rw;
    lock->unlock = swFileLock_unlock;
    lock->free = swFileLock_free;
    return 0;
}

3、信號(hào)量鎖

int swSem_create(swLock *lock, key_t key)
{
    int ret;
    lock->type = SW_SEM;//設(shè)置鎖類型為信號(hào)量鎖
    if ((ret = semget(key, 1, IPC_CREAT | 0666)) < 0)//創(chuàng)建信號(hào)量,這里設(shè)置的屬性IPC_CREAT,這表示這種信號(hào)量只能用于有親緣關(guān)系的進(jìn)程間
    {
        return SW_ERR;
    }
 
    if (semctl(ret, 0, SETVAL, 1) == -1)//設(shè)置信號(hào)量ret的值為1
    {
        swWarn("semctl(SETVAL) failed");
        return SW_ERR;
    }
    lock->object.sem.semid = ret;//設(shè)置信號(hào)量ID
 
    /*
     * 設(shè)置回調(diào)函數(shù)
     */
    lock->lock = swSem_lock;
    lock->unlock = swSem_unlock;
    lock->free = swSem_free;
 
    return SW_OK;
}
 
 

4、樂觀鎖

int swSpinLock_create(swLock *lock, int use_in_process)
{
    int ret;
    bzero(lock, sizeof(swLock));//初始化鎖對(duì)象
    lock->type = SW_SPINLOCK;//設(shè)置鎖的類型為樂觀鎖
    //執(zhí)行鎖的初始化操作,這里指明是在多進(jìn)程中使用
    if ((ret = pthread_spin_init(&lock->object.spinlock.lock_t, use_in_process)) < 0)
    {
        return -1;
    }
 
    /*
     * 設(shè)置回調(diào)函數(shù)信息
     */
    lock->lock = swSpinLock_lock;
    lock->unlock = swSpinLock_unlock;
    lock->trylock = swSpinLock_trylock;
    lock->free = swSpinLock_free;
    return 0;
}

5、互斥量鎖

int swMutex_create(swLock *lock, int use_in_process)
{
    int ret;
    bzero(lock, sizeof(swLock));
    lock->type = SW_MUTEX;
    pthread_mutexattr_init(&lock->object.mutex.attr);
    if (use_in_process == 1)
    {
        pthread_mutexattr_setpshared(&lock->object.mutex.attr, PTHREAD_PROCESS_SHARED);
    }
    if ((ret = pthread_mutex_init(&lock->object.mutex._lock, &lock->object.mutex.attr)) < 0)
    {
        return SW_ERR;
    }
    lock->lock = swMutex_lock;
    lock->unlock = swMutex_unlock;
    lock->trylock = swMutex_trylock;
    lock->free = swMutex_free;
    return SW_OK;
}

到此這篇關(guān)于swoole鎖的機(jī)制代碼實(shí)例講解的文章就介紹到這了,更多相關(guān)swoole鎖的機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Yii2框架視圖(View)操作及Layout的使用方法分析

    Yii2框架視圖(View)操作及Layout的使用方法分析

    這篇文章主要介紹了Yii2框架視圖(View)操作及Layout的使用方法,結(jié)合具體實(shí)例形式分析了Yii2框架視圖操作及布局layout相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • php單文件版在線代碼編輯器

    php單文件版在線代碼編輯器

    這篇文章主要介紹了php單文件版在線代碼編輯器,個(gè)人感覺相當(dāng)不錯(cuò),分享給大家,需要的朋友可以參考下
    2015-03-03
  • Thinkphp使用mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)多條件查詢方法

    Thinkphp使用mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)多條件查詢方法

    這篇文章主要介紹了Thinkphp使用mongodb數(shù)據(jù)庫(kù)實(shí)現(xiàn)多條件查詢方法,修改了mongodb驅(qū)動(dòng)文件來實(shí)現(xiàn)復(fù)合查詢、多條件查詢,需要的朋友可以參考下
    2014-06-06
  • thinkPHP3.2實(shí)現(xiàn)分頁(yè)自定義樣式的方法

    thinkPHP3.2實(shí)現(xiàn)分頁(yè)自定義樣式的方法

    這篇文章主要介紹了thinkPHP3.2實(shí)現(xiàn)分頁(yè)自定義樣式的方法,結(jié)合實(shí)例形式分析了thinkPHP3.2針對(duì)底層框架代碼的修改與使用相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 寶塔 php修改了php.ini配置不生效的問題及解決方法

    寶塔 php修改了php.ini配置不生效的問題及解決方法

    最近在使用hypref,php的版本是7.4,服務(wù)器linux,用寶塔安裝完php,并裝完swoole插件后,安裝了swoole后,需要在php.ini中修改一下配置文件,本文給大家分享寶塔 php修改了php.ini配置不生效的問題及解決方法,感興趣的朋友一起看看吧
    2023-09-09
  • Swoole?webSocket客服IM消息系統(tǒng)方案解析

    Swoole?webSocket客服IM消息系統(tǒng)方案解析

    這篇文章主要為大家介紹了Swoole?webSocket客服IM消息系統(tǒng)方案解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • php導(dǎo)入模塊文件分享

    php導(dǎo)入模塊文件分享

    本文給大家分享的是php導(dǎo)入模塊文件分享,主要參數(shù)有導(dǎo)入文件路徑字符串,可以用"."代替"/", 導(dǎo)入文件類型的擴(kuò)展名(帶"."號(hào)),也可以是class/inc(簡(jiǎn)寫方式), 如果導(dǎo)入成功則返回true,否則返回異常對(duì)象,有需要的小伙伴參考下吧。
    2015-03-03
  • php旋轉(zhuǎn)圖片90度的方法

    php旋轉(zhuǎn)圖片90度的方法

    php旋轉(zhuǎn)圖片90度,方法很簡(jiǎn)單,我們直接看函數(shù)
    2013-11-11
  • PHP實(shí)現(xiàn)即時(shí)輸出、實(shí)時(shí)輸出內(nèi)容方法

    PHP實(shí)現(xiàn)即時(shí)輸出、實(shí)時(shí)輸出內(nèi)容方法

    這篇文章主要介紹了PHP實(shí)現(xiàn)即時(shí)輸出、實(shí)時(shí)輸出內(nèi)容方法,本文直接給出實(shí)現(xiàn)方法,需要的朋友可以參考下
    2015-05-05
  • ThinkPHP5 的簡(jiǎn)單搭建和使用詳解

    ThinkPHP5 的簡(jiǎn)單搭建和使用詳解

    這篇文章主要介紹了ThinkPHP5 的簡(jiǎn)單搭建和使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11

最新評(píng)論