PostgreSQL V9.6 LWLock实现分析(八)

LWLock释放锁

    LWLockRelease()函数释放特定的锁(参数指定的锁), LWLockReleaseAll()函数调用LWLockRelease()函数完成当前进程持有的(通过“held_lwlocks”持有)所有锁的释放。另外有个LWLockReleaseClearVar()函数配对加锁操作中的LWLockAcquireOrWait()函数使用。

void

LWLockRelease(LWLock *lock) //释放锁并唤醒等待者

{...

    for (i = num_held_lwlocks; --i >= 0;)  //准备从held_lwlocks中释放锁,为此锁找到当初的加锁模式

    {

        if (lock == held_lwlocks[i].lock)

        {

            mode = held_lwlocks[i].mode;

            break;

        }

    }

...

    if (mode == LW_EXCLUSIVE) //释放锁,即给锁标志位置位(还原为初始值)

        oldstate = pg_atomic_sub_fetch_u32(&lock->state, LW_VAL_EXCLUSIVE);

    else

        oldstate = pg_atomic_sub_fetch_u32 (&lock->state, LW_VAL_SHARED);

...

    if (check_waiters)

    {

        /* XXX: remove before commit? */

        LOG_LWDEBUG("LWLockRelease", lock, "releasing waiters");

        LWLockWakeup(lock); //如果此锁上有等待这,唤醒等待者(告诉操作系统重新调度进程)

    }

...

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值