swoole_lock提供的try操作用来加锁操作。与lock方法不同的是,trylock()不会阻塞,它会立即返回。
$lock->trylock();
- 加锁成功返回true,此时可以修改共享变量。
- 加锁失败返回false,表示有其他进程持有锁。
- SWOOlE_SEM 信号量没有trylock方法
下面我们看下其流程。
static PHP_METHOD(swoole_lock, trylock)
{
swLock *lock = swoole_get_object(getThis());//获取swoole内部封装对象
if (lock->trylock == NULL)//获取失败
{
swoole_php_error(E_WARNING, "lock[type=%d] can't use trylock", lock->type);
RETURN_FALSE;
}
SW_LOCK_CHECK_RETURN(lock->trylock(lock));//调用对象的trylock方法
}
1、互斥量
static int swMutex_trylock(swLock *lock)
{
return pthread_mutex_trylock(&lock->object.mutex._lock);//linux系统函数,非阻塞式获取锁
}
2、文件锁
//非阻塞式的获取锁,这里fcntl提供的特性,通过组合fcntl的cmd和type实现,详情可以参考fcntl接口的接口文档
static int swFileLock_trylock_rw(swLock *lock)
{
lock->object.filelock.lock_t.l_type = F_WRLCK;
return fcntl(lock->object.filelock.fd, F_SETLK, &lock->object.filelock);
}