最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

鎖,這個(gè)詞我們并不陌生,主要的應(yī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)文章

  • PHP使用Nginx實(shí)現(xiàn)反向代理

    PHP使用Nginx實(shí)現(xiàn)反向代理

    這篇文章主要為大家詳細(xì)介紹了PHP使用Nginx實(shí)現(xiàn)反向代理的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • session 加入redis的實(shí)現(xiàn)代碼

    session 加入redis的實(shí)現(xiàn)代碼

    本篇文章主要介紹了session 加入redis 的實(shí)例,對(duì)session 進(jìn)行了詳細(xì)介紹,并提供了代碼實(shí)例,需要的朋友可以參考下
    2016-07-07
  • 使用PHP如何實(shí)現(xiàn)高效安全的ftp服務(wù)器(一)

    使用PHP如何實(shí)現(xiàn)高效安全的ftp服務(wù)器(一)

    FTP服務(wù)器(File Transfer Protocol Server)是在互聯(lián)網(wǎng)上提供文件存儲(chǔ)和訪問服務(wù)的計(jì)算機(jī),它們依照FTP協(xié)議提供服務(wù),本文給大家介紹使用PHP如何實(shí)現(xiàn)高效安全的ftp服務(wù)器(一),對(duì)php ftp服務(wù)器相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • Laravel統(tǒng)一錯(cuò)誤處理為JSON的方法介紹

    Laravel統(tǒng)一錯(cuò)誤處理為JSON的方法介紹

    這篇文章主要給大家介紹了關(guān)于Laravel統(tǒng)一錯(cuò)誤處理為JSON的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • PHP中的使用curl發(fā)送請(qǐng)求(GET請(qǐng)求和POST請(qǐng)求)

    PHP中的使用curl發(fā)送請(qǐng)求(GET請(qǐng)求和POST請(qǐng)求)

    本篇文章主要介紹了PHP中的使用curl發(fā)送請(qǐng)求(GET請(qǐng)求和POST請(qǐng)求),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Yii Framework框架使用PHPExcel組件的方法示例

    Yii Framework框架使用PHPExcel組件的方法示例

    這篇文章主要介紹了Yii Framework框架使用PHPExcel組件的方法,結(jié)合實(shí)例形式分析了Yii Framework框架中PHPExcel組件的下載、導(dǎo)入、調(diào)用等相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • 淺談PHP發(fā)送HTTP請(qǐng)求的幾種方式

    淺談PHP發(fā)送HTTP請(qǐng)求的幾種方式

    這篇文章主要介紹了淺談PHP發(fā)送HTTP請(qǐng)求的幾種方式,整理一下除了使用 cURL 外 PHP 發(fā)送 HTTP 請(qǐng)求的方式,有興趣的可以了解一下。
    2017-07-07
  • php數(shù)組合并的二種方法

    php數(shù)組合并的二種方法

    這篇文章主要介紹了php數(shù)組合并的二種方法,同時(shí)講了用加號(hào)和用array_merge合并數(shù)組的區(qū)別,需要的朋友可以參考下
    2014-03-03
  • 新版php?study根目錄下文件夾無法顯示的圖文解決方法

    新版php?study根目錄下文件夾無法顯示的圖文解決方法

    這篇文章主要介紹了新版php?study根目錄下文件夾無法顯示解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • ThinkPHP表單自動(dòng)驗(yàn)證實(shí)例

    ThinkPHP表單自動(dòng)驗(yàn)證實(shí)例

    這篇文章主要介紹了ThinkPHP表單自動(dòng)驗(yàn)證實(shí)例,是ThinkPHP三大自動(dòng)中非常常用的一個(gè)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

通榆县| 盐山县| 东安县| 崇文区| 古田县| 安达市| 台南县| 晴隆县| 涟源市| 古田县| 中超| 桂平市| 象山县| 开江县| 舒城县| 碌曲县| 东乡| 平阳县| 泰安市| 理塘县| 旬邑县| 重庆市| 密云县| 乌鲁木齐县| 张家界市| 广西| 大石桥市| 交口县| 收藏| 冕宁县| 余姚市| 上栗县| 濮阳县| 肃南| 荣昌县| 扬州市| 芷江| 丹阳市| 宜良县| 高密市| 宁城县|