好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > swoole鎖的機制代碼實例講解

swoole鎖的機制代碼實例講解

熱門標簽:地圖標注平臺怎么給錢注冊 新河科技智能外呼系統怎么樣 福州人工外呼系統哪家強 常州地圖標注服務商 百度商鋪地圖標注 安裝電銷外呼系統 釘釘打卡地圖標注 衡水外呼系統平臺 注冊400電話申請

鎖,這個詞我們并不陌生,主要的應用場景會發生在高并發下進行鎖。今天的這篇文章咱們主要來講解一下swoole的鎖的機制,swoole_lock是如何實現的。

swoole_lock類支持5種鎖的類型:

  • 文件鎖 SWOOLE_FILELOCK
  • 讀寫鎖 SWOOLE_RWLOCK
  • 信號量 SWOOLE_SEM
  • 互斥鎖 SWOOLE_MUTEX
  • 自旋鎖 SWOOLE_SPINLOCK

創建這些鎖的過程其實就是調用構造函數的過程,調用的形式如下:

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

$type為鎖的類型

$lockfile,當類型為SWOOLE_FILELOCK時必須傳入,指定文件鎖的路徑

下面我們介紹下這個鎖的實現

static PHP_METHOD(swoole_lock, __construct)
{
    long type = SW_MUTEX;
    char *filelock;
    zend_size_t filelock_len = 0;
    int ret;
    //解析輸入參數,這里輸入參數有2個,其中type表示鎖的類型,另外個參數是文件鎖時必須傳入(表示文件鎖對應的文件路徑),其他鎖時,不需要這個參數
    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", type, filelock, filelock_len) == FAILURE)
    {
        RETURN_FALSE;
    }
    //從內存池申請鎖對象空間,這里僅僅是申請鎖空間
    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遍歷,創建鎖對象
    {
#ifdef HAVE_RWLOCK
    case SW_RWLOCK://如果是讀寫鎖
        ret = swRWLock_create(lock, 1);//創建鎖對象,類型為讀寫鎖
        break;
#endif
    case SW_FILELOCK://如果是文件鎖
        if (filelock_len = 0)//第二個參數有效性檢查
        {
            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) //調用linux函數open,打開文件(不存在則創建)
        {
            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);//創建鎖對象,類型為文件鎖
        break;
    case SW_SEM:
        ret = swSem_create(lock, IPC_PRIVATE);//創建鎖對象,類型為信號量
        break;
#ifdef HAVE_SPINLOCK
    case SW_SPINLOCK:
        ret = swSpinLock_create(lock, 1);//創建鎖對象,類型為樂觀鎖
        break;
#endif
    case SW_MUTEX:
    default:
        ret = swMutex_create(lock, 1);//創建鎖對象,類型為互斥量
        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側的對象和swoole內部對象關聯
    RETURN_TRUE;
}

以下分別介紹下各個不同鎖對象的創建過程。

1、讀寫鎖

int swRWLock_create(swLock *lock, int use_in_process)
{
    int ret;
    bzero(lock, sizeof(swLock));//鎖空間初始化
    lock->type = SW_RWLOCK;//設置鎖的類型為讀寫鎖
    pthread_rwlockattr_init(lock->object.rwlock.attr);//linux函數,鎖屬性信息初始化
    if (use_in_process == 1)//標記為在進程中使用,這里pthread開頭的linux函數默認都是針對線程的
    {
        //設置鎖的屬性信息,標記為在進程中使用
        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函數,鎖信息初始化
    {
        return SW_ERR;
    }
 
    /*
     * 設置鎖的回調函數
     */
    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;//設置鎖的類型為文件鎖
 
    /*
     * 設置鎖的回調函數
     */
    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;//設置鎖類型為信號量鎖
    if ((ret = semget(key, 1, IPC_CREAT | 0666))  0)//創建信號量,這里設置的屬性IPC_CREAT,這表示這種信號量只能用于有親緣關系的進程間
    {
        return SW_ERR;
    }
 
    if (semctl(ret, 0, SETVAL, 1) == -1)//設置信號量ret的值為1
    {
        swWarn("semctl(SETVAL) failed");
        return SW_ERR;
    }
    lock->object.sem.semid = ret;//設置信號量ID
 
    /*
     * 設置回調函數
     */
    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;//設置鎖的類型為樂觀鎖
    //執行鎖的初始化操作,這里指明是在多進程中使用
    if ((ret = pthread_spin_init(lock->object.spinlock.lock_t, use_in_process))  0)
    {
        return -1;
    }
 
    /*
     * 設置回調函數信息
     */
    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;
}

到此這篇關于swoole鎖的機制代碼實例講解的文章就介紹到這了,更多相關swoole鎖的機制內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

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

標簽:唐山 柳州 克拉瑪依 遼陽 白城 鷹潭 鶴崗 六安

巨人網絡通訊聲明:本文標題《swoole鎖的機制代碼實例講解》,本文關鍵詞  swoole,鎖,的,機制,代碼,實例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《swoole鎖的機制代碼實例講解》相關的同類信息!
  • 本頁收集關于swoole鎖的機制代碼實例講解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 啦啦啦高清视频在线观看播放| 亚洲欧美精品AAAAAA片| 99久久久国产精品免费播放器| 国产精品无码一二三区免费大肉 | 《【男男】开荤粗肉-v文》| 欧美丰满熟妇猛交大片潘金莲 | 国产精品午夜小视频观看| 日日射视频| 又大又粗又硬又紧又爽的软件| 久久久久美女| 好大好硬好湿再进去点| 国模无码视频一区二区三区哺乳期| www.com捏胸挤出奶| 亚洲男同video| 国产欧美一区二区三区在线老狼| 黄色激情视频在线观看| 一本大道久久久久精品嫩草 | 国产一区高清| 精品久久一区二区三区| 香蕉尹人在线观看免费下载| 男男gay调教| 真人一级毛片6O分钟| 一级毛片大全免费播放 | 亚洲精品一二三区学生无码| maya十八岁禁止| 国产一级a一级a爱片免费高清| 一本色道久久综合无码人妻软件 | 校花张开玉腿求我桶她小说| 疼疼疼疼疼疼轻点疼疼| 国产97图区色伦图片| 日老女人的b| 亚洲热热久久九九精品| 69日本xxxxxxxxx98| 男人插女人视频在线观看| 色情A片久久久久试看区| 美娟小雄谭婧铁辉4p小说| 同志小说又黄又刺激短篇小说| 国产精品久久永久免费| 久久欧美AV乱码人妻| 外国一级黄色| 爽┈好舒服┈快┈深视频APP |