欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁(yè) > 知識(shí)庫(kù) > swoole鎖的機(jī)制代碼實(shí)例講解

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

熱門標(biāo)簽:地圖標(biāo)注平臺(tái)怎么給錢注冊(cè) 新河科技智能外呼系統(tǒng)怎么樣 福州人工外呼系統(tǒng)哪家強(qiáng) 常州地圖標(biāo)注服務(wù)商 百度商鋪地圖標(biāo)注 安裝電銷外呼系統(tǒng) 釘釘打卡地圖標(biāo)注 衡水外呼系統(tǒng)平臺(tái) 注冊(cè)400電話申請(qǐng)

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

swoole_lock類支持5種鎖的類型:

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

創(chuàng)建這些鎖的過(guò)程其實(shí)就是調(diào)用構(gòu)造函數(shù)的過(guò)程,調(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ì)象,類型為樂(lè)觀鎖
        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)建過(guò)程。

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、樂(lè)觀鎖

int swSpinLock_create(swLock *lock, int use_in_process)
{
    int ret;
    bzero(lock, sizeof(swLock));//初始化鎖對(duì)象
    lock->type = SW_SPINLOCK;//設(shè)置鎖的類型為樂(lè)觀鎖
    //執(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)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解PHP Swoole與TCP三次握手
  • Swoole擴(kuò)展的6種模式深入詳解
  • php中Swoole的熱更新實(shí)現(xiàn)代碼實(shí)例
  • windows系統(tǒng)php環(huán)境安裝swoole具體步驟
  • linux系統(tǒng)虛擬主機(jī)開啟支持Swoole Loader擴(kuò)展的方法
  • Swoole源碼中如何查詢Websocket的連接問(wèn)題詳解
  • 在Windows系統(tǒng)上安裝Cygwin搭建Swoole測(cè)試環(huán)境的圖文教程
  • php使用goto實(shí)現(xiàn)自動(dòng)重啟swoole、reactphp、workerman服務(wù)的代碼
  • Centos7安裝swoole擴(kuò)展操作示例
  • 詳解Swoole TCP流數(shù)據(jù)邊界問(wèn)題解決方案

標(biāo)簽:唐山 柳州 克拉瑪依 遼陽(yáng) 白城 鷹潭 鶴崗 六安

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《swoole鎖的機(jī)制代碼實(shí)例講解》,本文關(guān)鍵詞  swoole,鎖,的,機(jī)制,代碼,實(shí)例,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《swoole鎖的機(jī)制代碼實(shí)例講解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于swoole鎖的機(jī)制代碼實(shí)例講解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    亚洲天堂免费看| 不卡一区二区在线| 7788色淫网站小说| 欧美喷潮久久久xxxxx| 一区二区三区中文字幕在线观看| 成人精品视频网站| 青青青伊人色综合久久| 黄色av网址在线观看| 欧美日韩的一区二区| 亚洲最新视频在线观看| 波多野结衣电影免费观看| 色欧美乱欧美15图片| 亚洲三级视频在线观看| av综合在线播放| 91久久精品日日躁夜夜躁欧美| 国产精品二三区| av亚洲精华国产精华精| 一本大道综合伊人精品热热| 亚洲色图20p| 少妇愉情理伦片bd| 精品婷婷伊人一区三区三| 亚洲午夜久久久久久久久久久 | 久久国产精品免费| 日韩人妻无码精品综合区| 精品国产91洋老外米糕| 久久精品国产一区二区| 日本二区在线观看| 欧美国产国产综合| caoporen国产精品视频| 91成人在线免费观看| 亚洲综合丁香婷婷六月香| 成人区人妻精品一区二| 日韩一区二区精品葵司在线| 日本美女一区二区三区| 永久免费毛片在线观看| 中文字幕不卡在线播放| 99久久综合99久久综合网站| 欧美日韩午夜精品| 日本欧美韩国一区三区| 国产成人在线网址| 亚洲视频一区在线观看| 美女久久久久久久久| 久久这里只有精品视频网| 国产69精品久久久久毛片| 色88888久久久久久影院野外| 亚洲动漫第一页| 性欧美一区二区| 中文字幕综合网| 日韩成人av一区二区| 国产午夜三级一区二区三| 91在线观看视频| 日韩一级二级三级| 国产99久久久国产精品免费看| 色婷婷综合激情| 日韩有码一区二区三区| 国产在线观看免费视频软件| 亚洲综合激情网| 日本猛少妇色xxxxx免费网站| 亚洲欧美另类小说| 欧美成人午夜精品免费| 中文字幕一区二区三区色视频| 亚洲一级Av无码毛片久久精品| 精品粉嫩超白一线天av| thepron国产精品| 欧美一区二区私人影院日本| 国产精一区二区三区| 欧美日韩在线亚洲一区蜜芽| 国内精品第一页| 欧美日韩日日骚| 国产一本一道久久香蕉| 欧美剧情电影在线观看完整版免费励志电影 | 国产精品大尺度| 在线视频 日韩| 中文字幕在线不卡国产视频| 朝桐光av一区二区三区| 中文字幕一区二区三区蜜月| 成人午夜剧场视频网站| 亚洲激情成人在线| 一本一本久久a久久| 偷拍亚洲欧洲综合| 色偷偷久久人人79超碰人人澡| 久久69国产一区二区蜜臀| 欧美网站大全在线观看| 国产露脸91国语对白| 91精品免费在线| 99久久免费精品| 国产日韩欧美精品一区| 艳妇乳肉亭妇荡乳av| 亚洲欧美日韩系列| www成人啪啪18软件| 欧美bbbbb| 欧美人伦禁忌dvd放荡欲情| 成人视屏免费看| 精品国产一区二区三区不卡| 年下总裁被打光屁股sp| 18涩涩午夜精品.www| 色噜噜噜噜噜噜| 日本不卡一区二区| 欧美男生操女生| 91视频一区二区| 中文字幕亚洲综合久久菠萝蜜| 舐め犯し波多野结衣在线观看| 日韩精品1区2区3区| 欧美午夜一区二区| a4yy欧美一区二区三区| 国产精品每日更新| 欧美福利在线视频| 精品一区二区三区在线播放视频| 91麻豆精品国产综合久久久久久 | 日本黄色一区二区| 国产成人av资源| 久久奇米777| 亚洲国产日韩一区无码精品久久久| 日韩精品免费视频人成| 欧美日韩黄色一区二区| 欧美高清精品一区二区| 亚洲码国产岛国毛片在线| 中文字幕电影av| 丁香一区二区三区| 中文字幕国产一区二区| 5566中文字幕| 国产91对白在线观看九色| 国产婷婷一区二区| a级黄色免费视频| 国产真实乱子伦精品视频| 久久日韩粉嫩一区二区三区| 欧洲av一区二区三区| 激情深爱一区二区| 久久久高清一区二区三区| www.99热| 国产精品原创巨作av| 中文字幕乱码日本亚洲一区二区| 久久国产高清视频| 国产91对白在线观看九色| 中文字幕一区三区| 一本大道综合伊人精品热热| 91视频在线观看| 亚洲成a人v欧美综合天堂下载| 欧美精品视频www在线观看| 国产51自产区| 日本不卡视频在线观看| 欧美va亚洲va国产综合| 国产成人免费观看网站| 国产成人日日夜夜| 亚洲免费观看高清完整版在线观看熊| 色噜噜狠狠色综合欧洲selulu| 99久免费精品视频在线观看| 亚洲永久免费视频| 91精品国产麻豆国产自产在线| 亚洲AV无码国产精品| 国产专区欧美精品| 国产精品久久影院| 欧美午夜片在线观看| 中国免费黄色片| 久久丁香综合五月国产三级网站| 久久久亚洲精品石原莉奈| 久久av红桃一区二区禁漫| 波多野结衣视频一区| 亚洲一级电影视频| 日韩视频免费观看高清完整版在线观看 | 精品无人码麻豆乱码1区2区 | 国产婷婷色一区二区三区四区| 成人涩涩小片视频日本| 91热门视频在线观看| 日日夜夜精品免费视频| 久久精品男人天堂av| 色婷婷综合激情| 亚洲国产第一区| 国产精品12区| 亚洲精品成人少妇| 欧美电视剧免费全集观看| 日韩av毛片在线观看| 久久久久亚洲av无码专区首jn| 免播放器亚洲一区| 国产精品日韩精品欧美在线| 欧美性高清videossexo| 一区二区精品免费| www.亚洲精品| 男人的天堂久久精品| 中文字幕中文字幕一区| 欧美一级日韩免费不卡| 永久免费看片直接| 手机在线看片日韩| 成人免费高清在线观看| 日韩有码一区二区三区| 国产精品盗摄一区二区三区| 欧美一区二区三区男人的天堂| 亚洲精品电影院| 亚洲少妇18p| 成人av免费在线观看| 裸体歌舞表演一区二区| 亚洲精品成人精品456| 国产亚洲欧美一级| 欧美日韩国产一二三| 国产成人免费在线观看视频| 中文字幕天堂网| av成人动漫在线观看| 国产真实乱偷精品视频免| 午夜欧美在线一二页| 国产精品不卡一区二区三区|