Lock [编辑本页]

swoole1.6.4版本增加了锁的实现。PHP代码中可以很方便地创建一个锁,用来实现数据同步。swoole_lock类支持5种锁的类型:

  1. 文件锁 SWOOLE_FILELOCK
  2. 读写锁 SWOOLE_RWLOCK
  3. 信号量 SWOOLE_SEM
  4. 互斥锁 SWOOLE_MUTEX
  5. 自旋锁 SWOOLE_SPINLOCK

注意:请勿在onReceive等回调函数中创建锁,否则底层的GlobalMemory内存会持续增长,造成内存泄漏。

示例:

$lock = new swoole_lock(SWOOLE_MUTEX);
echo "[Master]create lock\n";
$lock->lock();
if (pcntl_fork() > 0)
{
    sleep(1);
    $lock->unlock();
} 
else
{
    echo "[Child] Wait Lock\n";
    $lock->lock();
    echo "[Child] Get Lock\n";
    $lock->unlock();
    exit("[Child] exit\n");
}
echo "[Master]release lock\n";
unset($lock);
sleep(1);
echo "[Master]exit\n";

  • DeivaLiang

    if(pcntl_fork() > 0) 请问这个是什么意思?目的是什么?

  • snipe

    判断是否创建了子进程。一般返回的是子进程ID

  • 米大大

    这个例子有问题吧 子进程会一直等待锁。 创建子进程时,子进程会复制父进程的变量lock,此时的lock是已经加锁的了, 所有子进程在次调用$lock->lock()时会一直等待。

  • 渡边至秦

    SWOOlE_SPINLOCK 是不是拼写错了 SWOOIE->SWOOLE

  • 梁义

    数据共享只能有一个进程操作共享数数据 不然会发生重复的情况 不知道这样理解对不对

  • 屏风山下的猎人

    错了吧,>0 是父进程,只有pcntl_fock==0才是子进程

  • 万济能

    锁的作用就是这样啊,对临界区的代码或者资源进行枷锁,从而实现数据同步访问

  • 马来酸

    pcntl_fork函数是fork一个子进程,父进程和子进程 都从fork的位置开始向下继续执行。父进程执行过程中,得到的fork返回值为子进程号,而子进程得到的是0。这里子进程会阻塞,等待父进程unlock啊