生产者消费者——一对一

同步中有一个“生产者消费者”的经典问题,也叫它“有界缓冲区”

生产者生产数据,消费者取数据是消费(取出)数据。”数据多,空间少”才能造成生产者消费者问题
(数据)空的时候不能消费,(空间)满的时候不能生产.

这一篇实现一个生产者对应一个消费者,即一对一的情况

#include
#include
#include

#define MAX_PRODUCER_SIZE 1
#define MAX_CONSUMER_SIZE 1
#define MAX_COUNT 20
#define MAX_BUFFER_SIZE 8

struct pcst
{
    pthread_mutex_t mutex;
    pthread_cond_t not_full;
    pthread_cond_t not_empty;
    int buffer[MAX_BUFFER_SIZE];
    int write_pos;
    int read_pos;
    int nvalue;
}shared = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER,
    PTHREAD_COND_INITIALIZER};
//注意not_full/not_empty是一个结构体,系统中它的初始化是PTHREAD_MUTEX_INITIALIZER,这个东西是以宏的形式定义的,所以在这里就对not_full/not_empty进行初始化比较方便,不然后面对它赋值时,相当于给一个结构体赋值,编译会报错。类似结尾给出的一样

void init_pcst()
{
    shared.write_pos = 0;
    shared.read_pos = 0;
    shared.nvalue = 1;
}
void put_value(struct pcst *pc, int value)
{
    pthread_mutex_lock(&pc->mutex);
    if((pc->write_pos+1)%MAX_BUFFER_SIZE == pc->read_pos)
        pthread_cond_wait(&pc->not_full, &pc->mutex);

    pc->buffer[pc->write_pos++] = value;
    pc->write_pos %= MAX_BUFFER_SIZE;

    pthread_cond_signal(&pc->not_empty);
    pthread_mutex_unlock(&pc->mutex);
}

int get_value(struct pcst *pc)
{
    pthread_mutex_lock(&pc->mutex);
    if(pc->read_pos == pc->write_pos)
        pthread_cond_wait(&pc->not_empty, &pc->mutex);

    int data = pc->buffer[pc->read_pos++];
    pc->read_pos %= MAX_BUFFER_SIZE;

    pthread_cond_signal(&pc->not_full);
    pthread_mutex_unlock(&pc->mutex);
    return data;
}
void* producer(void *arg)
{
    for(int i=1; i<=MAX_COUNT; ++i)
    {
        put_value(&shared, shared.nvalue);
        shared.nvalue++;
    }
}
void* consumer(void *arg)
{
    while(1)
    {
        int value = get_value(&shared);
        printf("%d\n", value);
        if(value >= MAX_COUNT)
            break;
       // sleep(1);
    }
}
int main(int argc, char const* argv[])
{
   // shared.write_pos = shared.read_pos = 0;
    //shared.nvalue = 1;
    init_pcst();
    pthread_t p_id[MAX_PRODUCER_SIZE];
    pthread_t c_id[MAX_CONSUMER_SIZE];
    for(int i=0; ifor(int i=0; ifor(int i=0; ifor(int i=0; ireturn 0;
}

结果
生产者消费者——一对一_第1张图片

系统对PTHREAD_COND_INITIALIZER的定义等
这里写图片描述
这里写图片描述
对结构体赋值的结果
生产者消费者——一对一_第2张图片

你可能感兴趣的:(//【IPC与网络部分】)