码迷,mamicode.com
首页 > 数据库 > 详细

berkeley db self block机制的研究

时间:2016-03-03 13:15:33      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

bdb mutex有两种用途:

  1.   作为latch, 保护资源(内存数据结构, 文件操作);
  2.   wait-notifiy. 设置SELF_BLOCK标志位. 用在逻辑锁, group commit时等待.

mux_win32.c 和mut_tas.c的实现类似,

  1. spin, 通过OS机制去 原子tas某lock标志位; 成功则退出.
  2. spin不成功, 则 等待-重试. win32通过 WaitForSingleObject, tas通过 OS 线程sleep原语(win32 unlock, 调用PlusEvent)


在mut_pthread.c 中, 不去spin

  1. pthread_mutex_lock;
  2. 如SELF_BLOCK, 通过pthread_cond_wait 做wait. (unlock时调用pthread_cond_signal)

 

db mutex应该提供memory barrier语义, tas中调用MEMBAR_ENTER(). x86不用考虑乱序, pthread lock会提供membar语义. pthread会设置PTHREAD_PROCESS_SHARED, 提供多进程支持.


为什么只在pthread中才考虑SELF_BLOCK呢?
SELF_BLOCK语义: 初始化mtx后, 马上lock一次. 再一次 lock则被锁住. 

  1. win32/tas: 通过tas 标志位. 因为mtx标志位已经设置, 再次lock会spin-wait-retry不断重复;
  2. pthread: 仅使用pthread_mutex_lock无法满足self block. 如果同一个线程两次 lock同一mtx, 根据参数, 可能会deadlock, return error, 成功, undefined; 一个线程去unlock另一个线程 lock的mtx, 也会 error或undefined. 

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_lock.html

而且 文档提到: Mutexes are expected to be locked only for a few instructions.

所以必须使用conditional variable:
http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_cond_timedwait.html
基本上, condition的工作原理 和java的wait-notify完全(完全么?)一致:

  • condition wait前 当前线程必须已经拿到 mutex 锁, 否则undefined;
  • condition wait 释放当前mutex锁, 当前线程被block.
  • wait被notify, broadcast唤醒(java notify, notify all?)
  • 线程被唤醒, 在从wait返回前, 需要拿到 mtx锁, 过程和 pthread_mutex_lock一样. 没拿到被block.
  • wait必须放在while(predict) 里.
mtx:   locked                                       unlocked
T1:                lock并被block.                                       得到mtx锁
T2:                                    unlock mtx             唤醒T1

最终 mtx还是锁住的状态.

berkeley db self block机制的研究

标签:

原文地址:http://www.cnblogs.com/brayden/p/5238115.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!