一共有三個生產者和四個消費者,緩沖區大小為10,為了簡單起見,生產者生產的都是5這個常數,但是不知道為什么運行不了,Linux下我也不知道該怎么除錯,代碼是這樣的:
//生產者消費者問題
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
int in=0, out=0; //in和out為生產者和消費者在緩沖區內使用的陣列下標
int buffer[10]={0,0,0,0,0,0,0,0,0,0}; //緩沖區大小為10
sem_t mutex,empty,full; //mutex為緩沖池的互斥信號量,empty表示慷訓沖區的數量,full表示滿緩沖區數量
int produce_an_item(){ //提供給生產者
int i=5;
return i;
}
//生產者
void *producter(void *arg){
while(1){
int i=produce_an_item(); //得到資料
sem_wait(&empty);
sem_wait(&mutex);
printf("生產者讀到了資料%d\n",i);
buffer[in]=i; //將資料放入緩沖區
in = (in+1)%10; //下標向前移動
sem_post(&mutex);
sem_post(&full);
}
}
//消費者
void *consumer(void *arg){
while(1){
sem_wait(&full);
sem_wait(&mutex);
int i=buffer[out]; //i代表從緩沖區讀出的資料
printf("消費者取出的資料為:%d\n",i);
buffer[out]=0; //讀取后將此置為0
out=(out+1)%10;
sem_post(&mutex);
sem_post(&empty);
}
}
int main(){
//創建生產者執行緒
pthread_t p1,p2,p3;
pthread_create(&p1,NULL,producter,NULL);
pthread_create(&p2,NULL,producter,NULL);
pthread_create(&p3,NULL,producter,NULL);
//創建消費者行程
pthread_t c1,c2,c3,c4;
pthread_create(&c1,NULL,consumer,NULL);
pthread_create(&c2,NULL,consumer,NULL);
pthread_create(&c3,NULL,consumer,NULL);
pthread_create(&c4,NULL,consumer,NULL);
//初始化互斥信號量
sem_init(&mutex,0,1);
sem_init(&empty,0,10);
sem_init(&full,0,0);
//運行執行緒
pthread_join(p1,NULL);
pthread_join(p2,NULL);
pthread_join(p3,NULL);
pthread_join(c1,NULL);
pthread_join(c2,NULL);
pthread_join(c3,NULL);
pthread_join(c4,NULL);
return 0;
}
程式經常運行不起來,不知道是為什么,頭都暈了。。請大家幫忙看看

uj5u.com熱心網友回復:
55555有人嗎uj5u.com熱心網友回復:
運行不了是啥意思 編譯出錯還是運行了沒反映或者其他?Linux下可以用gdb除錯把
uj5u.com熱心網友回復:
運行不了就是這樣

按回車之后就一直卡在這里不運行(pc3是程式名),只有按CTRL+c才能結束掉,不知道具體是哪里除了問題。偶爾也會像上面那樣可以執行,但大部分時間是這樣卡住的。
我也試了用gdb除錯,但是看不懂執行緒到底運行到哪里了
uj5u.com熱心網友回復:
看看是不是有其他的行程也在gdb或者運行uj5u.com熱心網友回復:
沒有欸。。應該是程式本身的問題吧
uj5u.com熱心網友回復:
你程式寫的是死回圈,沒有正常退出機制,在按ctrl+c 強行終止程式時,信號量不會被釋放。再次運行時,行程掛起等待這些信號量,因此就出現你的情況了。你重啟下電腦程式又可以運行了。
uj5u.com熱心網友回復:
linux 和 windows 關于信號量的操作不一樣linux創建后不銷毀即使程式退出還是存在的,可以用ipcs -s查看
windows創建后,如果程式退出,那么這個信號量是自動銷毀的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/56488.html
標籤:新手樂園
上一篇:minist資料集
