如何用C语言实现多线程下生产者消费者互斥同步问题

如何用C语言实现多线程下生产者消费者互斥同步问题,第1张

整个程序以伪代码形式给出,当做一个提示吧,这样你就应该有思路了

生产者在存储区满时不能再生产,进入等待,消费者同理

完成同步互斥效果

/*----以下为代码部分-----*/

//定义全局变量

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


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12561930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存