请问如何用C语言实现“生产者与消费者问题”?(最好附上完整的C语言源代码)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问如何用C语言实现“生产者与消费者问题”?(最好附上完整的C语言源代码)相关的知识,希望对你有一定的参考价值。

“生产者消费者”问题是计算机《操作系统》教程中的一个典型问题。理解了这个问题,有利于我们理解操作系统中进程的同步问题。

我这是C++的,在网上搜到的,借给你用用, 其实都一样 改个cout cin 就是C了 没问题的 这是我们操作系统实验
#includewindows.h
#includeiostream.h
#includestdio.h
HANDLE hMutex;
HANDLE hFull, hEmpty; HANDLE p,c;
DWORD WINAPI Producer(LPVOID);
DWORD WINAPI Consumer(LPVOID);
int a[100],i,j;
void main()

cout生产者消费者问题endl;
a[100]=i=j=0;
hMutex=CreateMutex(NULL,FALSE,NULL);
hFull=CreateSemaphore(NULL,0,1,NULL);
hEmpty=CreateSemaphore(NULL,1,1,NULL);
p=CreateThread(NULL,0,Producer,NULL,0,NULL);
c=CreateThread(NULL,0,Consumer,NULL,0,NULL);
Sleep(150000);

void Produce()
cout生产者生产产品...endl;
cout生产成功endl;

DWORD WINAPI Producer(LPVOID lpPara)
while(TRUE)
WaitForSingleObject(hEmpty,INFINITE);
WaitForSingleObject(hMutex,INFINITE);
Produce();
a[i]=i;
i=(i+1)%100;
Sleep(5000);
ReleaseMutex(hMutex);
ReleaseSemaphore(hFull,1,NULL);
return 0;

void Consume()

cout消费者消费产品 ... endl;
cout消费成功endl;
cout请等待...endl;

DWORD WINAPI Consumer(LPVOID lpPara)

while(TRUE)
WaitForSingleObject(hFull,INFINITE);
WaitForSingleObject(hMutex,INFINITE);

cout缓冲区a[j]endl;
a[j]=999;
j=(j+1)%100;
Consume();
Sleep(5000);
ReleaseMutex(hMutex);
ReleaseSemaphore(hEmpty,1,NULL);

return 0;
参考技术A 原理很简单,但是实现是非常复杂的。
其中牵涉到大量的用于系统内核的C语言库函数,对于刚刚开始学习的学生来说,那实在是太困难了。
我也学操作系统。P语言描述的也不错,就凑合着用吧。
这里有完整源代码38K。你可以想象有多么夸张了。见我的参考资料。

参考资料:http://www.hsip.cn/soft/3/2006/1D1513422145.html

如何用C++语言实现AOV网的所有拓扑排序?(最好能实现动态演示)

实现演示很麻烦,好像要用MFC吧?

参考技术A #define max 图的顶点数
//弧节点的结构
typedef struct EdgeNode

int adjvex;
struct EdgeNode *next;
;
//顶点节点的结构
typedef struct Vnode

VertexType vertex;//顶点数据类型
EdgeNode *link;
Adjlist[max];
//拓扑排序算法描述
void topsort(Adjlist g)
//假设G有n个顶点、e条边的有向图,g是他的邻接表,每个节点设两个
//域vex,next,对入度为0的顶点设计带链的栈,top指示栈的指针,in为入度

readlist();//输入e条弧并建立邻接表
top=0;
for(i=1;i<=n;i++)//查入度为0的顶点,并建立链栈
if(g[i].in==0)

g[i].in=top;
top=i;

m=0;//设m为计数器计算输出的顶点个数
while(top!=0)

j=top;
top=g[top].in;//退栈
printf("%d",j);
m++;//输出顶点并计数
q=g[j].link;//q是指针,指示以j为尾的弧
while(q!=NULL)

k=q->vex;//顶点k为j的直接后继
g[k].in=g[k].in-1;//入度减1
if(g[k].in==0)

g[k].in=top;
top=k;//入度为0的顶点进栈

q=p->next;


if(m<n)
printf("the network have cycle");//输出顶点数不足n,说明网中无环

以上是关于请问如何用C语言实现“生产者与消费者问题”?(最好附上完整的C语言源代码)的主要内容,如果未能解决你的问题,请参考以下文章

如何用C++语言实现AOV网的所有拓扑排序?(最好能实现动态演示)

如何用C语言实现进度条

如何用c语言实现http服务器

如何用C语言实现对图像的二值化?

如何用C语言播放一段音频呢

如何用c语言printf输出bmp图片的像素信息。