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

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

 更新時(shí)間:2021年03月04日 10:14:20   作者:assasinSteven  
這篇文章主要介紹了swoole鎖的機(jī)制代碼實(shí)例講解,對于鎖的介紹講解的很清晰,有感興趣的同學(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
  • 信號量 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í)必須傳入(表示文件鎖對應(yīng)的文件路徑),其他鎖時(shí),不需要這個(gè)參數(shù)
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &type, &filelock, &filelock_len) == FAILURE)
    {
        RETURN_FALSE;
    }
    //從內(nèi)存池申請鎖對象空間,這里僅僅是申請鎖空間
    swLock *lock = SwooleG.memory_pool->alloc(SwooleG.memory_pool, sizeof(swLock));
    if (lock == NULL)//申請空間失敗
    {
        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)建鎖對象
    {
#ifdef HAVE_RWLOCK
    case SW_RWLOCK://如果是讀寫鎖
        ret = swRWLock_create(lock, 1);//創(chuàng)建鎖對象,類型為讀寫鎖
        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)建鎖對象,類型為文件鎖
        break;
    case SW_SEM:
        ret = swSem_create(lock, IPC_PRIVATE);//創(chuàng)建鎖對象,類型為信號量
        break;
#ifdef HAVE_SPINLOCK
    case SW_SPINLOCK:
        ret = swSpinLock_create(lock, 1);//創(chuàng)建鎖對象,類型為樂觀鎖
        break;
#endif
    case SW_MUTEX:
    default:
        ret = swMutex_create(lock, 1);//創(chuàng)建鎖對象,類型為互斥量
        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è)的對象和swoole內(nèi)部對象關(guān)聯(lián)
    RETURN_TRUE;
}

以下分別介紹下各個(gè)不同鎖對象的創(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)都是針對線程的
    {
        //設(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));//鎖對象信息初始化
    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、信號量鎖

int swSem_create(swLock *lock, key_t key)
{
    int ret;
    lock->type = SW_SEM;//設(shè)置鎖類型為信號量鎖
    if ((ret = semget(key, 1, IPC_CREAT | 0666)) < 0)//創(chuàng)建信號量,這里設(shè)置的屬性IPC_CREAT,這表示這種信號量只能用于有親緣關(guān)系的進(jìn)程間
    {
        return SW_ERR;
    }
 
    if (semctl(ret, 0, SETVAL, 1) == -1)//設(shè)置信號量ret的值為1
    {
        swWarn("semctl(SETVAL) failed");
        return SW_ERR;
    }
    lock->object.sem.semid = ret;//設(shè)置信號量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));//初始化鎖對象
    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)容請搜索腳本之家以前的文章或繼續(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í)例,對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ù)器(一),對php ftp服務(wù)器相關(guān)知識感興趣的朋友一起學(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ì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • PHP中的使用curl發(fā)送請求(GET請求和POST請求)

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

    本篇文章主要介紹了PHP中的使用curl發(fā)送請求(GET請求和POST請求),小編覺得挺不錯(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請求的幾種方式

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

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

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

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

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

    這篇文章主要介紹了新版php?study根目錄下文件夾無法顯示解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(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

最新評論

高青县| 三亚市| 漾濞| 进贤县| 银川市| 临高县| 舒城县| 双城市| 渭源县| 桓台县| 泊头市| 安宁市| 邹城市| 安福县| 温泉县| 临泉县| 云浮市| 扎囊县| 澎湖县| 武清区| 饶平县| 从化市| 凌海市| 牡丹江市| 常州市| 十堰市| 遂平县| 六枝特区| 和林格尔县| 利川市| 邓州市| 新巴尔虎左旗| 南木林县| 沙河市| 南投县| 合川市| 建始县| 荥阳市| 治多县| 莆田市| 阜新|