乙個場所,兩種模型,三種關係
場所:執行緒安全的佇列
模型:生產者、消費者
關係:生產者與生產者之間(互斥)、生產者與消費者(同步與互斥)、消費者與消費者(互斥)的關係
功能:解耦合、支援忙閒不均、支援併發
耦合度:相互之間的依賴關係越緊密,耦合度越高
// 使用條件變數生產者與消費者模型
#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 我們這裡用乙個單鏈表當做那段共享記憶體,簡單實現生產者消費者模...