//producer-consumer model
#include
#include
#define buffer_size 100
// 緩衝區數量
#define max_seq 200
//#define n_consumer 10
//消費者數量
#define n_producer 3
//生產者數量
#define t_consume 100000
//消費者休息時間(毫秒)
#define t_produce 100000
//生產者休息時間(毫秒)
#define over ( - 1)
//停止標誌
#define full(aloop) (aloop.nused == buffer_size)
#define empty(aloop) (aloop.nused == 0)
#define next(p) (((p+1) == (buffer_size))?0:(p+1))
#define prev(p) (((p) == 0)?(buffer_size-1):(p-1))
#define afterw_emptonoemp(aloop) (aloop.nused == 1)
#define atterr_fulltonofull(aloop) (aloop.nused == buffer_size-1)
struct arrayloop
;int seq =0;
typedef
struct prodcons
prodcons;
prodcons g_prod;
/* 初始化緩衝區結構 */
void
init
(prodcons *b)
void
cleanup_handler
(void
* arg)
/* 將產品放入緩衝區,這裡是存入乙個整數*/
intput
(prodcons *b,
unsigned
int pid)
int data = seq;
if(data == max_seq)
/* 寫資料,並移動指標 */
b->aloop.buffer[b->aloop.writepos]
= data;
printf
("\033[1;31m p[%d] put the pos %d ,data %d\n"
, pid,b->aloop.writepos,data)
;++b->aloop.nused;
b->aloop.writepos =
next
(b->aloop.writepos)
;/* 設定緩衝區非空的條件變數*/if(
afterw_emptonoemp
(b->aloop)
)++seq;
pthread_mutex_unlock
(&b->lock)
;return0;
}/* 從緩衝區中取出整數*/
intget
(prodcons *b,
int pid)
/* 讀資料,移動讀指標*/
data = b->aloop.buffer[b->aloop.readpos];if
(over == data)
printf
("\033[1;32m c[%d] get pos %d ,product %d \n"
, pid,b->aloop.readpos,data)
;--b->aloop.nused;
//printf("nused %d\n",b->aloop.nused);
b->aloop.readpos =
next
(b->aloop.readpos)
;/* 設定緩衝區未滿的條件變數*/if(
atterr_fulltonofull
(b->aloop)
)pthread_mutex_unlock
(&b->lock)
;return data;
}void
*producer
(void
*data)
}//put(&buffer, over,thn);
printf
("p[%d] producer stop\n"
,thn)
;return
null
;pthread_cleanup_pop(0
);//正常退出不執行,即便引數為1,因為放在了return 之後了
}void
*consumer
(void
*data)
}printf
("c[%d] consumer stop\n"
,thn)
;return
null
;pthread_cleanup_pop(0
);}int
main
(void
)for
(i =
0;i < n_consumer;i++
)/* 兩個執行緒結束*/
//sleep(6);
//for(i = 0;i < n_producer;i++)
//for(i = 0;i < n_consumer;i++)
for(i =
0;i < n_producer;i++
)printf
("here readpos[%d],writepos[%d],seq[%d]\n"
,g_prod.aloop.readpos,g_prod.aloop.writepos,seq)
;
g_prod.aloop.buffer[g_prod.aloop.writepos]
= over;
++g_prod.aloop.nused;
pthread_cond_broadcast
(&g_prod.notempty)
;for
(i =
0;i < n_consumer;i++
)printf
("\033[1;00m\n");
return0;
}
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者消費者
using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...
生產者消費者
執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...