生產消費者

2021-10-01 03:31:00 字數 3219 閱讀 9314

//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 喚...