当前位置:首页 » 编程语言 » 生产者与消费者c语言

生产者与消费者c语言

发布时间: 2022-08-03 03:56:16

① 简单的“生产者-消费者”问题 请用c语言编写

int mutex=1 ,Vm=10 , vn=0;int in=0;int out=0; while (1)/*生产者进程*/{ { 生产下一个产品 } P(M) P(mutex) buffer[in]=proct in=(in+1) %10 V(mutex) V(N)} while(1) //消费者进程{ P(N); p(mutex); goods=buffer[out]; out=(out+1)%10; V(mutex); V(M);}

② 谁会用C语言编写生产者与消费者问题

呵呵 !
不知道我这样的理解对不对!!!
程序如下,你看看吧.

#include "windows.h"
#include "conio.h"
#include "stdio.h"

#define MAX 20 //定义缓冲池的最大容量是20

int count=5; //初始产品的数量为5

void Proclucer()//生产者函数
{
while(1)
{
if(count >= MAX)
{
printf("缓冲池已满!等待 1 秒!\n");
Sleep(3000);
}
else
{
count++;
printf("生产了一个产品!当前产品的数量是: %d \n\n",count);
Sleep(1300); //注意毫秒为单位
}
}
}

void Consumer() //消费者函数
{
while(1)
{
if(count == 0)
{
printf("缓冲池已空!等待 2 秒!\n");
Sleep(2000);
}
else
{
count--;
printf("取出了一个产品!当前产品的数量是: %d \n\n",count);
Sleep(1000);
}
}
}

int tStop() //停止函数
{
getch(); //如果按回车的话,有时候要按两次才可以停止,我还没有解决这个问题
return 11; //但是按其他按键就会立即停止的了 呵呵!
}

void Start() //开始函数
{
int m;
HANDLE ahThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Proclucer,NULL,0,NULL);
HANDLE bhThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Consumer,NULL,0,NULL);
HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)tStop,NULL,0,NULL); //多线程
m=tStop();
if(m==11) //满足停止条件
{
CloseHandle(ahThread);
CloseHandle(ahThread);
CloseHandle(hThread);
printf("\nClose Thread Success!\n"); //停止成功
}
}

void main() //主函数
{
Start(); //开始
printf("\n");
}

③ 生产者-消费者”问题 用C语言编写

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<semaphore.h>
#include<pthread.h>

#definePRODUCER10//生产者数量
#defineCONSUMER8//消费者数量
#defineBUFFER20//缓冲区数量

sem_tempty,full;//同步信号量
pthread_mutex_tmutex;//互斥信号量
intbuffer[BUFFER];//缓冲区

intprocer_id=0,consumer_id=0;//生产者消费者ID
intindex_in=0,index_out=0;//生产者消费者存放消费的位置

voidprint()//输出缓冲区
{
inti;
printf("Buffer: ");
for(i=0;i<20;i++)
{
printf("___");
}
printf(" ");
for(i=0;i<20;i++)
printf("|%d|",buffer[i]);
printf(" ");
for(i=0;i<20;i++)
{
printf("———");
}
printf(" ");
}
void*Procer()//生产者函数
{
intID=++procer_id;

while(1)
{
sleep(3);
sem_wait(&empty);
pthread_mutex_lock(&mutex);
index_in=index_in%BUFFER;

printf("Procer%din%d. ",ID,index_in);
buffer[index_in]=1;//缓冲区置0
print();//输出缓冲区情况
index_in++;
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void*Consumer()//消费者函数
{
intID=++consumer_id;

while(1)
{
sleep(3);
sem_wait(&full);
pthread_mutex_lock(&mutex);
index_out=index_out%BUFFER;

printf("33[01;34mConsumer%din%d33[0m ",ID,index_out);
buffer[index_out]=0;//缓冲区置0
print();//输出缓冲区情况
index_out++;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
}

intmain()
{
//freopen("text.txt","w",stdout);
intrthread[18],i;
pthread_tprocer[PRODUCER];//生产者
pthread_tconsumer[CONSUMER];//消费者

intsinit1=sem_init(&empty,0,BUFFER);//初始化同步信号量
intsinit2=sem_init(&full,0,0);
intminit=pthread_mutex_init(&mutex,NULL);//初始化互斥信号量
if(sinit1&&sinit2)
{
printf("seminitializefailed/n");
exit(1);
}
if(minit)
{
printf("seminitializefailed/n");
exit(1);
}
for(i=0;i<PRODUCER;i++)//创建生产者线程
{
rthread[i]=pthread_create(&procer[i],NULL,Procer,NULL);
if(rthread[i])
{
printf("procer%dcreatefailed/n",i);
exit(1);
}
}
for(i=0;i<CONSUMER;i++)//创建消费者线程
{
rthread[i]=pthread_create(&consumer[i],NULL,Consumer,NULL);
if(rthread[i])
{
printf("consumer%dcreatefailed/n",i);
exit(1);
}
}
for(i=0;i<PRODUCER;i++)//销毁生产者线程
{
pthread_join(procer[i],NULL);
}
for(i=0;i<CONSUMER;i++)//销毁生产者线程
{
pthread_join(consumer[i],NULL);
}
exit(0);
}

④ 用C语言实现--生产者与消费者的问题(PV操作)

这个问题蛮好的
我给你个程序
给我加分啊
#include
<windows.h>
#include
<stdio.h>
#include
<stdlib.h>
typedef
HANDLE
Semaphore;
//
信号量的Windows原型
#define
P(S)
WaitForSingleObject(S,
INFINITE)
//
定义Windows下的P操作
#define
V(S)
ReleaseSemaphore(S,
1,
NULL)
//
定义Windows下的V操作
#define
rate
1000
#define
CONSUMER_NUM
10
/*
消费者个数
*/
#define
PRODUCER_NUM
10
/*
生产者个数
*/
#define
BUFFER_NUM
4
/*
缓冲区个数
*/
char
*thing[10]
=
{"猪脸",
"牛鞭",
"羊腰",
"驴蹄",
"狼心",
"狗肺",
"猴肝",
"老虎屁股",
"大象肚",
"河马大肠"};
struct
Buffer
{
int
proct[BUFFER_NUM];
//
缓冲区
int
start,
end;
//
两个指针
}
g_buf;
Semaphore
g_semBuffer,
g_semProct,
g_mutex;
//
消费者线程
DWORD
WINAPI
Consumer(LPVOID
para)
{
//
i表示第i个消费者
int
i
=
*(int
*)para;
int
ptr;
//
待消费的内容的指针
printf("
猪头-%03d:
猪头我来啦!\n",
i);
Sleep(300);
while
(1)
{
printf("
猪头-%03d:
我要吃.........!\n",
i);
//
等待产品
P(g_semProct);
//
有产品,先锁住缓冲区
g_buf
P(g_mutex);
//
记录消费的物品
ptr
=
g_buf.start;
//
再移动缓冲区指针
g_buf.start
=
(g_buf.start+1)%BUFFER_NUM;
//
让其他消费者或生产者使用
g_buf
V(g_mutex);
printf("
猪头-%03d:
我吃
buf[%d]
=
%s\n",
i,
ptr,
thing[g_buf.proct[ptr]]);
Sleep(rate*rand()%10+110);
//
消费完毕,并释放一个缓冲
printf("
猪头-%03d:
我爽了!
buf[%d]
=
%s\n",
i,
ptr,
thing[g_buf.proct[ptr]]);
V(g_semBuffer);
}
return
0;
}
//
生产者线程
DWORD
WINAPI
Procer(LPVOID
para)
{
int
i
=
*(int
*)para
-
CONSUMER_NUM;
int
ptr;
int
data;
//
产品
printf("工作狂-%03d:
我来啦!\n",
i);
Sleep(300);
while
(1)
{
printf("工作狂-%03d:
我干干干…………\n",
i);
Sleep(rate*rand()%10+110);
data
=
rand()%10;
printf("工作狂-%03d:
搞出一个东西
data
=
%s!\n",
i,
thing[data]);
//
等待存放空间
P(g_semBuffer);
//
有地方,先锁住缓冲区
g_buf
P(g_mutex);
//
记录消费的物品
ptr
=
g_buf.end;
//
再移动缓冲区指针
g_buf.end
=
(g_buf.end+1)%BUFFER_NUM;
//
让其他消费者或生产者使用
g_buf
V(g_mutex);
printf("工作狂-%03d:
搁到
buf[%d]
=
%s\n",
i,
ptr,
thing[data]);
g_buf.proct[ptr]
=
data;
Sleep(rate/2*rand()%10+110);
//
放好了完毕,释放一个产品
printf("工作狂-%03d:
buf[%d]
=
%s
放好了,大家吃!\n",
i,
ptr,
thing[g_buf.proct[ptr]]);
V(g_semProct);
}
return
0;
}
int
main(int
argc,
char
*argv[])
{
//
线程技术,前面为消费者线程,后面为生产者线程
HANDLE
hThread[CONSUMER_NUM+PRODUCER_NUM];
//
线程计数
//srand(time());
DWORD
tid;
int
i=0;
//
初始化信号量
g_mutex
=
CreateSemaphore(NULL,
BUFFER_NUM,
BUFFER_NUM,
"mutexOfConsumerAndProcer");
g_semBuffer
=
CreateSemaphore(NULL,
BUFFER_NUM,
BUFFER_NUM,
"BufferSemaphone");
g_semProct
=
CreateSemaphore(NULL,
0,
BUFFER_NUM,
"ProctSemaphone");
if
(
!g_semBuffer
||
!g_semProct
||
!g_mutex)
{
printf("Create
Semaphone
Error!\n");
return
-1;
}
int
totalThreads
=
CONSUMER_NUM+PRODUCER_NUM;
//
开启消费者线程
printf("先请猪头们上席!\n");
for
(i=0;
i<CONSUMER_NUM;
i++)
{
hThread[i]
=
CreateThread(NULL,
0,
Consumer,
&i,
0,
&tid);
if
(
hThread[i]
)
WaitForSingleObject(hThread[i],
10);
}
printf("厨子们就位!\n");
for
(;
i<totalThreads;
i++)
{
hThread[i]
=
CreateThread(NULL,
0,
Procer,
&i,
0,
&tid);
if
(
hThread[i]
)
WaitForSingleObject(hThread[i],
10);
}
//
生产者和消费者的执行
WaitForMultipleObjects(totalThreads,
hThread,
TRUE,
INFINITE);
return
0;
}

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

我这是C++的,在网上搜到的,借给你用用, 其实都一样 改个cout cin 就是C了 没问题的 这是我们操作系统实验
#includewindows.h
#includeiostream.h
#includestdio.h
HANDLE hMutex;
HANDLE hFull, hEmpty; HANDLE p,c;
DWORD WINAPI Procer(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,Procer,NULL,0,NULL);
c=CreateThread(NULL,0,Consumer,NULL,0,NULL);
Sleep(150000);
}
void Proce(){
cout生产者生产产品...endl;
cout生产成功endl;
}
DWORD WINAPI Procer(LPVOID lpPara){
while(TRUE){
WaitForSingleObject(hEmpty,INFINITE);
WaitForSingleObject(hMutex,INFINITE);
Proce();
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;
}

⑥ 求用c语言实现消费者和生产者的问题,简单点,就用一个生产者和一个消费者的两进程同步算法,谢谢啦各位

#include<stdio.h>
#include<stdlib.h>

int mutex=1,full=0,empty=3,x=0;

int main()
{
int n;
void procer();
void consumer();
int wait(int);
int signal(int);
printf("\n1.Procer\n2.Consumer\n3.Exit");
while(1)
{
printf("\nEnter your choice:");
scanf("%d",&n);
switch(n)
{
case 1: if((mutex==1)&&(empty!=0))
procer();
else
printf("Buffer is full!!");
break;
case 2: if((mutex==1)&&(full!=0))
consumer();
else
printf("Buffer is empty!!");
break;
case 3:
exit(0);
break;
}
}

return 0;
}

int wait(int s)
{
return (--s);
}

int signal(int s)
{
return(++s);
}

void procer()
{
mutex=wait(mutex);
full=signal(full);
empty=wait(empty);
x++;
printf("\nProcer proces the item %d",x);
mutex=signal(mutex);
}

void consumer()
{
mutex=wait(mutex);
full=wait(full);
empty=signal(empty);
printf("\nConsumer consumes item %d",x);
x--;
mutex=signal(mutex);
}

热点内容
怎么访问暗网 发布:2025-01-23 07:02:04 浏览:665
无线配置代理选什么 发布:2025-01-23 06:52:54 浏览:824
c程序汇编程序 发布:2025-01-23 06:49:42 浏览:840
cmd命令与linux命令 发布:2025-01-23 06:40:26 浏览:806
linux用户目录权限 发布:2025-01-23 06:37:49 浏览:233
学计算机避免编程 发布:2025-01-23 06:29:09 浏览:661
易语言机器人源码 发布:2025-01-23 06:24:03 浏览:320
汇编语言的编译可以叫解释吗 发布:2025-01-23 06:23:22 浏览:35
tomcat编译后的文件 发布:2025-01-23 06:05:46 浏览:254
惠普畅游人14是什么配置表 发布:2025-01-23 05:57:39 浏览:296