swoole_lock提供的lock_read操作用于加读锁,表示仅锁定读。
bool $lock->lock_read();
- 在持有读锁的过程中,其他进程依然可以获得读锁,可以继续发生读操作
- 但不能
$lock->lock()
或$lock->trylock()
,这两个方法是获取独占锁,在独占锁加锁时,其他进程无法再进行任何加锁操作,包括读锁 - 当另外一个进程获得了独占锁(调用
$lock->lock
/$lock->trylock
)时,$lock->lock_read()
会发生阻塞,直到持有独占锁的进程释放锁 - 只有
SWOOLE_RWLOCK
和SWOOLE_FILELOCK
类型的锁支持只读加锁
下面我们分析下其流程。
static PHP_METHOD(swoole_lock, lock_read)
{
swLock *lock = swoole_get_object(getThis());//获取swoole内部封装对象
if (lock->lock_rd == NULL)//获取失败
{
swoole_php_error(E_WARNING, "lock[type=%d] can't use lock_read", lock->type);
RETURN_FALSE;
}
SW_LOCK_CHECK_RETURN(lock->lock_rd(lock));//执行锁定读
}
1、文件锁
//fcntl特性,通过F_SETLK和F_RDLCK实现锁定读
static int swFileLock_trylock_rd(swLock *lock)
{
lock->object.filelock.lock_t.l_type = F_RDLCK;
return fcntl(lock->object.filelock.fd, F_SETLK, &lock->object.filelock);
}
2、读写锁
static int swRWLock_trylock_rd(swLock *lock)
{
return pthread_rwlock_tryrdlock(&lock->object.rwlock._lock);//调用linux函数执行锁定读
}