状态
InitializeCriticalSection()初始化临界区对象
EnterCriticalSection()等待指定临界区对象的所有权
LeaveCriticalSection()释放指定临界区对象的所有权
二、设计思路
将所有的读者和所有的写者分别放进两个等待队列中,
当读允许时就让读者队列释放一个或多个读者,当写允许时,
释放第一个写者操作。
读者优先:
如果没有写者正在操作,则读者不需要等待,用一个整型
变量 readcount 记录当前的读者数目,用于确定是否释放写
者线程,(当 readcout=0 时,说明所有的读者都已经读完,
释 放 一 个 写 者 线 程 ) , 每 个 读 者 开 始 读 之 前 都 要 修 改
readcount,为了互斥的实现对 readcount 的修改,需要一个互
斥对象 Mutex 来实现互斥。
另外,为了实现写-写互斥,需要一个临界区对象 write,当
写者发出写的请求时,必须先得到临界区对象的所有权。通
过这种方法,可以实现读写互斥,当 readcount=1 时,(即
第一个读者的到来时,),读者线程也必须申请临界区对象
的所有权.
当读者拥有临界区的所有权,写者都阻塞在临界区对象
write 上。当写者拥有临界区对象所有权时,第一个判断完
readcount==1 后,其余的读者由于等待对 readcount 的判断,
阻塞在 Mutex 上!
写者优先:
写者优先和读者优先有相同之处,不同的地方在:一
旦有一个写者到来时,应该尽快让写者进行写,如果有一个
写者在等待,则新到的读者操作不能读操作,为此添加一个
整型变量 writecount,记录写者的数目,当 writecount=0 时才
可以释放读者进行读操作! 为了实现对全局变量 writecount
的互斥访问,设置了一个互斥对象 Mutex3。
为了实现写者优先,设置一个临界区对象 read,当有写者在写
或等待时,读者必须阻塞在临界区对象 read 上。
读者除了要一个全局变量 readcount 实现操作上的互斥外,
评论4
最新资源