生產者消費者模型

2021-08-21 01:32:43 字數 3166 閱讀 8410

生產者消費者模型生產者

生產者消費者模型

這裡指上面的倉庫,我們可以用棧,鍊錶等資料結構構造.

生產者 - 負責向上面的倉庫中生產資源,倉庫已滿時,需等待到倉庫有空為止.

消費者 - 負責消費上面倉庫中的資源,倉庫為空時,虛等待到生產者向倉庫中生產了商品為止.

生產者 & 生產者 -> 互斥

消費者 & 消費者 -> 互斥

生產者 & 消費者 -> 同步互斥

**演示生產者消費者模型

#include

using namespace std;

#include

#include

#include

#include

pthread_cond_t g_cond;

pthread_mutex_t g_lock;

// 乙個場景

// 我們用鍊錶構造

typedef struct listnode

}listnode;

void init(listnode* head)

void push(listnode* head,int data)

int pop(listnode* head)

// 兩種角色

// 生產者

// 消費者

// 三種關係

// 生產者 & 生產者 -> 互斥

// 消費者 & 消費者 -> 互斥

// 生產者 & 消費者 -> 同步互斥

int p = 1;

void* product(void* arg)

return null;

} void* consume(void* arg)

cout<

int val = pop(head);

printf("consume : %d\n",val);

pthread_mutex_unlock(&g_lock);

usleep(123456);

} return null;

} int main()

for(i = 0; i < 2; ++i)

// 銷毀互斥鎖和條件變數

pthread_cond_destroy(&g_cond);

pthread_mutex_destroy(&g_lock);

return 0;

} 結果演示:

觀察結果可以看到

posix訊號量

posix和systemv版本的訊號量作用相同,都是用於同步操作,達到無衝突的訪問共享資源.

但是,posix可用於執行緒間的同步.

初始化訊號量

#include

int sem_init(sem_t* sem, int pshared, unsigned int value);

引數:pshared : 0 代表執行緒間共享, 1 代表程序間共享.

value : 訊號量初始值

銷毀訊號量

int sem_destroy(sem_t* sem);

等待訊號量(p)

這個操作功能同 p 操作,會使訊號量的值減 1

int sem_wait(sem_t* sem);

發布訊號量(v)

這個操作功能同 v 操作,表示資源使用完畢,可以歸還訊號量,會使訊號量的值加 1

int sem_post(sem_t* sem);

我們將上面的生產者消費者模型改寫為posix訊號量版本:

#include

using namespace std;

#include

#include

#include

#include

#include

#define max 100 // 倉庫的最大容量

sem_t data;     // 表示當前空位的資源個數,為完成同步

sem_t blank;    // 表示當前商品的資源個數,為完成同步

sem_t g_block;  // 二元互斥鎖,為完成互斥

// 一種場景

// 這裡我們使用乙個環形的佇列

typedef struct queue

queue;

void init(queue* q)

void push(queue* q,int data) }

void pop(queue* q) }

// 兩個角色

// 三種關係

int d = 1;

void* product(void* arg)

return null; }

void* consume(void* arg)

return null; }

int main()

for(i = 0; i < 2; ++i)

sem_destroy(&data);

sem_destroy(&blank);

sem_destroy(&g_block);

return 0;

}演示結果:

從結果我麼也可以看出:

以上的環形佇列巧妙的將空格也當做一種資源

判斷當前生產者是否可以繼續生產商品的依據就是當前有沒有blank資源

判斷消費者是否可以繼續消費的依據就是當前是否有data資源

生產者消費者模型

1.生產者消費者問題 producer consumer 有限緩衝,多執行緒同步。生產者執行緒和消費者執行緒共享固定大小緩衝區。2.關鍵是保證生產者不會再緩衝區滿時加入資料,消費者不會在緩衝區空時消耗資料。3.解決辦法 讓生產者在緩衝區滿時休眠,等下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒...

生產者消費者模型

生產者與消費者 3,2,1 三種關係 生產者與消費者 互斥,同步 消費者與消費者 互斥 生產者與生產者 互斥 條件變數 int pthread cond destroy pthread cond t cond int pthread cond init pthread cond t restrict...

生產者消費者模型

當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源 即佇列 的占用權。因為生產者如果不釋放對臨界資源的占用權,那麼消費者就無法消費佇列中的商品,就不會讓佇列有空間,那麼生產者就會一直無限等待下去。因此,一般情況下,當佇列滿時,會讓生產者交出對臨界資...