當前位置:首頁 » 編程語言 » 生產者與消費者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 08:50:00 瀏覽:514
安卓q用起來怎麼樣 發布:2025-01-23 08:49:14 瀏覽:294
foreach資料庫 發布:2025-01-23 08:49:05 瀏覽:741
什麼是車棚配置 發布:2025-01-23 08:42:58 瀏覽:312
智能電視盒子無線網密碼在哪裡 發布:2025-01-23 08:42:14 瀏覽:277
代理提取源碼 發布:2025-01-23 08:41:35 瀏覽:62
nas網路伺服器為什麼貴 發布:2025-01-23 08:00:00 瀏覽:941
語音伺服器未連接如何連接視頻 發布:2025-01-23 07:59:11 瀏覽:883
日流量10萬需要什麼類型伺服器 發布:2025-01-23 07:58:27 瀏覽:501
伺服器獲取地址失敗 發布:2025-01-23 07:55:18 瀏覽:850