生产者在存储区满时不能再生产,进入等待,消费者同理
完成同步互斥效果
/*----以下为代码部分-----*/
//定义全局变量
int empty = 1//信号量表示存储单元空,可以生产产品
int full = 0//信号量表示存储单元空,不可以消费产品
//P *** 作
void P(int &mutex)
{
*mutex--
if(*mutex<0)
{
//当前进程挂起的程序实现
}
}
//悄肆V *** 作
void V(int &mutex)
{
*mutex++
if(*mutex <=0)
{
//唤醒等待中的进程程序实现
}
}
//生产者程序
void producer()
{
P(&empty)//若此时存储区空,则可以生产,否则程序挂起等待
//生产一个产品 *** 作
V(&full)//通知消费者进程,可以取产品
}
//消费者程序
void consumer(){
P(&full)//若此时存储区不空,则可以取产品,否则消费者程序运枯挂起等待
//取走一个产品 *** 作
V(&empty)//通知生产者进程可以生产
}
//主函数
void main()
{
//分别调用旁运洞生产者,消费者程序,顺序不限,因为已经完成信号量的同步,若发生同步问题就会等待
producer();
consumer();
consumer();
producer();
………………
}
这是 *** 作系统里行闷顷面的读者写者问题写下伪代码:
int readcount = 0// 读进罩雀程计数
semaphore writeblock = 1
semaphore mutex = 1
cobegin
process reader_i()
{
P(mutex)
readcount++
if (readcount == 1)
P(writeblock)// 封锁写者进程
V(mutex)
{ 读资源A }
P(mutex)
readcount--
if (readcount == 0)
V(writecount)
V(mutex)
}
process writer()
{
P(writeblock)
{ 写资源A }
V(writeblock)
}
在Windows中,实现进程同步互斥可以使用mutex、event、semaphore等内核对象
隐约记档陆得些Win 32 API,供参考:
CreateMutex
CreateEvent
WaitForSingleObject
EnterCriticalSection
LeaveCriticalSection
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)