生產者與消費者模型 使用條件變數和訊號量實現

2021-09-25 15:33:52 字數 3100 閱讀 6658

乙個場所,兩種模型,三種關係

場所:執行緒安全的佇列

模型:生產者、消費者

關係:生產者與生產者之間(互斥)、生產者與消費者(同步與互斥)、消費者與消費者(互斥)的關係

功能:解耦合、支援忙閒不均、支援併發

耦合度:相互之間的依賴關係越緊密,耦合度越高

// 使用條件變數生產者與消費者模型

#include #include #include #define max_queue 10

#define max_size 4

class blockqueue

~blockqueue()

private:

std::queue_queue;

int _capacity; // 佇列節點最大數量

pthread_mutex_t _mutex;

pthread_cond_t _cond_producter;

pthread_cond_t _cond_consumer;

public:

void queuepush(int data) // 執行緒安全的入隊操作

_queue.push(data);

consumerwakeup();

queueunlock();

}void queuepop(int* data) // 執行緒安全的出隊操作adddic:

*data = _queue.front();

_queue.pop();

producterwakeup();

queueunlock();

}private:

// 輔助函式

void queuelock()

void queueunlock()

void consumerwakeup()

void consumerwait()

void producterwakeup()

void producterwait()

bool queueisfull()

bool queueisempty()

};int i = 0;

pthread_mutex_t mutex; // 保護生產產品量

void* producter_route(void* arg)

return null;

}void* consumer_route(void* arg)

return null;

}int main()

ret = pthread_create(&consumer_tid[i], null, consumer_route, (void*)& q);

if (ret != 0)

}for (int i = 0; i < max_size; ++i)

return 0;

}

訊號量:計數器 + 等待佇列 + 等待與喚醒功能

通過自身計數器,實現條件判斷:

當條件滿足時則可以獲取資料直接返回,計數減一;

條件不滿足時,阻塞

當產生資源後,通過訊號的喚醒功能喚醒等待並且計數加一

sem_t                            // 定義

sem_init                         // 初始化

sem_wait                         // 條件判斷是否阻塞,計數-1

sem_post                         // 計數加1,喚醒阻塞

sem_destroy                      // 銷毀

訊號量初始化

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

sem 「訊號量」

pshared 「0 用於執行緒間同步與互斥 !0 用於程序間同步與互斥」

value 「訊號量初值」

訊號量的使用

// 進行條件判斷

// 如果計數 <= 0 ,阻塞;否則立即返回,計數減一

int sem_wait(sem_t* sem);

// 計數加一,喚醒阻塞

int sem_post(sem_t* sem);

訊號量的銷毀

//  使用訊號量實現生產者消費者模型

#include #include #include #include #define max_queue 10

#define max_size 4

class ringqueue

~ringqueue ()

private:

// 輔助函式

void queuelock()

void queueunlock()

void producterwait()

void producterpost()

void consumerwait()

void consumerpost()

public:

void queuepush(int data)

void queuepop(int* data)

};void* producter_route(void* arg)

return null;

}void* consumer_route(void* arg)

return null;

}int main()

}for (int i = 0; i < max_size; ++i)

}for (int i = 0; i < max_size; ++i)

return 0;

}

生產者與消費者模型 及 條件變數

生產者與消費者問題 及 條件變數 什麼是生產者和消費者模型生產者,顧名思義就是生產東西的人,而消費者就消費的人。在系統中,假設有一塊記憶體,生產者要向記憶體中放資料,而消費者要從記憶體區域中拿資料。這片記憶體區域可以被所有的執行緒訪問,所以這片記憶體區域就是臨界資源,而在對臨界區的訪問時,要保證不會...

生產者與消費者模型

先介紹幾個函式 生產消費者模型 二者共享資料value,這裡,生產者是producter,消費者是consumer。生產者負責放物品到value中,消費者使用wait 等待生產者的通知。當得到通知後,消費者取出物品,並且用notify 通知生產者,可以再放下一批物品。例項 package cn.ed...

生產者與消費者模型

如圖 一共有三種關係 生產者與生產者的互斥關係,消費者與消費者的互斥關係,生產者與消費者的互斥且同步關係。兩種角色 生產者 執行緒 與消費者 執行緒 乙個交易場所 倉庫 一段記憶體空間,且可存可取 二 基於單向鍊錶的生產者消費者模型 1 我們這裡用乙個單鏈表當做那段共享記憶體,簡單實現生產者消費者模...