生产者-消费者问题mutex,full,empty:semaphoremutex :=1:■生产者P:full:=0:empty:=n;Wait(empty):消费者C:Wait(mutex):Wait(full):Buffer(in)=nextp;Wait(mutex):in:=(in+1) mod n;netxc=buffer(out):out:=(out+1) mod n;Signal(mutex):Signal(mutex):Signal(full);Signal(empty):
生产者-消费者问题 ◼ 生产者P: Wait(empty); Wait(mutex); Buffer(in)=nextp; in:=(in+1) mod n; Signal(mutex); Signal(full); ◼ 消费者C: Wait(full); Wait(mutex); netxc=buffer(out); out:=(out+1) mod n; Signal(mutex); Signal(empty); mutex,full,empty:semaphore mutex :=1; full:=0; empty:=n;
读者-写者问题(读者优先)读者R :rmutex.wmutex:semaphorermutex:=1:wmutex:=1Wait(rmutex)rcount:intrcount++ :rcount:=O;if(rcount == 1)写者W:Wait(wmutex):Wait(wmutex):Signal(rmutex):Write_ActionO:Read_ActionO:Signal(wmutex)Wait(rmutex):rcount--:if(rcount == O)Signal(wmutex)Signal(rmutex):
读者-写者问题(读者优先) ◼ 读者R: Wait(rmutex); rcount++; if(rcount == 1) Wait(wmutex); Signal(rmutex); Read_Action(); Wait(rmutex); rcount-; if(rcount == 0) Signal(wmutex); Signal(rmutex); ◼ 写者W: Wait(wmutex); Write_Action(); Signal(wmutex); rmutex,wmutex:semaphore rmutex :=1;wmutex :=1; rcount:int rcount:=0;
哲学家进餐问题哲学家i(i=0,1..5)array of fork:semaphorefork]:=1,1,1,1,1]:thinkingO:Wait(fork[i]):思考,怎么解决Wait(fork[(i+1) mod 5])死锁问题?eatingO:Signal(fork[i]):Signal(fork[(i+1) mod 5])
哲学家进餐问题 ◼ 哲学家i(i=0,1.5) thinking(); Wait(fork[i]); Wait(fork[(i+1) mod 5]) eating(); Signal(fork[i]); Signal(fork[(i+1) mod 5]) array of fork[]:semaphore fork[] :={1,1,1,1,1}; 思考,怎么解决 死锁问题 ?
同步对象同步对象是指windows/Linux中用于实现同步与互斥的实体·包括互斥量(Mutex)、信号量(Semaphore)、临界区(CriticalSection)和事件(Events)等本实验中使用到信号量、互斥量和临界区三个同步对象
同步对象 同步对象是指Windows/Linux中用于实现同步与互斥的实体, 包括互斥量(Mutex)、信号量(Semaphore)、临界区(Critical Section)和事件(Events)等。 本实验中使用到信号量、互斥量和临界区三个同步对象
实验方案设计以读者写者(读者优先)为例:1.创建若干线程分别模拟读者操作和写者操作2.读线程间和写线程间对各自局部共享资源的访问修改采用Mutex对象,结合WaitForSingleObject保证互操作3.读线程与写线程争用全局临界资源采用临界区(CriticalSeciton)。4.统管读写线程的线程采用WaitForMultipleObjects保证等待所有的线程结束
实验方案设计 以读者-写者(读者优先)为例: 1.创建若干线程分别模拟读者操作和写者操作 2.读线程间和写线程间对各自局部共享资源的访问修改采用 Mutex对象,结合WaitForSingleObject 保证互斥操作。 3.读线程与写线程争用全局临界资源采用临界区(Critical Seciton)。 4.统管读写线程的线程采用WaitForMultipleObjects 保证等待 所有的线程结束