資源簡介
以生產(chǎn)者/消費(fèi)者問題為例來闡述Linux線程的控制和通信。一組生產(chǎn)者線程與一組消費(fèi)者線程通過緩沖區(qū)發(fā)生聯(lián)系。生產(chǎn)者線程將生產(chǎn)的產(chǎn)品送入緩沖區(qū),消費(fèi)者線程則從中取出產(chǎn)品。緩沖區(qū)有N 個,是一個環(huán)形的緩沖池。 使用命令cc consumer.c -o consumer編譯
代碼片段和文件信息
/*
?*?consumer.c
?*
?*??Created?on:?2019年3月13日
?*??????Author:?WanQing
?*/
#include?
#include?
#include?
#define?BUFFER_SIZE?16?//?緩沖區(qū)數(shù)量
struct?prodcons?{
//?緩沖區(qū)相關(guān)數(shù)據(jù)結(jié)構(gòu)
int?buffer[BUFFER_SIZE];?/*?實(shí)際數(shù)據(jù)存放的數(shù)組*/
pthread_mutex_t?lock;?/*?互斥體lock?用于對緩沖區(qū)的互斥操作?*/
int?readpos?writepos;?/*?讀寫指針*/
pthread_cond_t?notempty;?/*?緩沖區(qū)非空的條件變量?*/
pthread_cond_t?notfull;?/*?緩沖區(qū)未滿的條件變量?*/
};
/*?初始化緩沖區(qū)結(jié)構(gòu)?*/
void?init(struct?prodcons?*b)?{
pthread_mutex_init(&b->lock?NULL);
pthread_cond_init(&b->notempty?NULL);
pthread_cond_init(&b->notfull?NULL);
b->readpos?=?0;
b->writepos?=?0;
}
/*?將產(chǎn)品放入緩沖區(qū)這里是存入一個整數(shù)*/
void?put(struct?prodcons?*b?int?data)?{
pthread_mutex_lock(&b->lock);
/*?等待緩沖區(qū)未滿*/
if?((b->writepos?+?1)?%?BUFFER_SIZE?==?b->readpos)?{
pthread_cond_wait(&b->notfull?&b->lock);
}?/*else?if?(b->writepos?==?b->readpos)?{
?}*/
pthread_cond_signal(&b->notempty);
/*?寫數(shù)據(jù)并移動指針?*/
b->buffer[b->writepos]?=?data;
b->writepos++;
if?(b->writepos?>=?BUFFER_SIZE)
b->writepos?=?0;
/*?設(shè)置緩沖區(qū)非空的條件變量*/
pthread_mutex_unlock(&b->lock);
}
/*?從緩沖區(qū)中取出整數(shù)*/
int?get(struct?prodcons?*
評論
共有 條評論