生產者消費者模型生產者
生產者消費者模型
這裡指上面的倉庫,我們可以用棧,鍊錶等資料結構構造.
生產者 - 負責向上面的倉庫中生產資源,倉庫已滿時,需等待到倉庫有空為止.
消費者 - 負責消費上面倉庫中的資源,倉庫為空時,虛等待到生產者向倉庫中生產了商品為止.
生產者 & 生產者 -> 互斥
消費者 & 消費者 -> 互斥
生產者 & 消費者 -> 同步互斥
**演示生產者消費者模型
#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...
生產者消費者模型
當佇列滿時,生產者需要等待佇列有空間才能繼續往裡面放入商品,而在等待的期間內,生產者必須釋放對臨界資源 即佇列 的占用權。因為生產者如果不釋放對臨界資源的占用權,那麼消費者就無法消費佇列中的商品,就不會讓佇列有空間,那麼生產者就會一直無限等待下去。因此,一般情況下,當佇列滿時,會讓生產者交出對臨界資...