2016-07-24 12:01:30 | 分类: 数据库 | 标签: | 举报 | 字号 大 中 小 订阅
用微信 “扫一扫”
将文章分享到朋友圈。
用易信 “扫一扫”
将文章分享到朋友圈。
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); // 如果此锁上有等待这,唤醒等待者(告诉操作系统重新调度进程)
}
...
}
评论这张
阅读( 5 ) | 评论( 0 )
用微信 “扫一扫”
将文章分享到朋友圈。
用易信 “扫一扫”
将文章分享到朋友圈。
喜欢 推荐 转载