swoole锁的机制代码实例讲授

锁,这个词我们并不生疏,主要的应用场景会产生在高并发下举办锁。本日的这篇文章咱们主要来讲授一下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、读写锁

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsdpys.html