ZBLOG

请把以下代码改成通过信号量实现生产者和消费者模型/*这段代码实现了一个生产者-消费者模型,使用一个缓冲区来进行通信。具体解释如下: 定义了两个结构体Node和Buffer,分别用来表示节点和缓冲区。 使用buffer_init函数初始化缓冲区,包括头节点、尾节点、大小、互斥锁、以及两个条件变量。 buffer_put函数用来往缓冲区中插入数据,首先加锁后判断缓冲区是否已满,如果满了就等待条件变量cond_producer被唤醒。然后创建一个新的节点,将数据存储...

#include #include #include #include #include #include //添加信号量头文件 #define MAX_BUFFER_SIZE 50 #define MIN_BUFFER_SIZE 5

typedef struct Node {

int data;
struct Node *next;

} Node;

typedef struct Buffer {

Node *head;
Node *tail;
int size;
pthread_mutex_t mutex;
pthread_cond_t cond_producer;
pthread_cond_t cond_consumer;
sem_t empty; //定义空缓冲区信号量
sem_t full; //定义满缓冲区信号量

} Buffer;

int length[MAX_BUFFER_SIZE]; void buffer_init(Buffer *buffer) {

buffer->head = NULL;
buffer->tail = NULL;
buffer->size = 0;
pthread_mutex_init(&(buffer->mutex), NULL);
pthread_cond_init(&(buffer->cond_producer), NULL);
pthread_cond_init(&(buffer->cond_consumer), NULL);
sem_init(&(buffer->empty), 0, MAX_BUFFER_SIZE); //初始化空缓冲区信号量为MAX_BUFFER_SIZE
sem_init(&(buffer->full), 0, 0); //初始化满缓冲区信号量为0

}

void buffer_put(Buffer *buffer, int data) {

sem_wait(&(buffer->empty)); //等待空缓冲区信号量
pthread_mutex_lock(&(buffer->mutex));
Node *node = (Node *)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if (buffer->tail == NULL)
{
    buffer->head = node;
    buffer->tail = node;
}
else
{
    buffer->tail->next = node;
    buffer->tail = node;
}
buffer->size++;
printf("Produced %d (buffer size: %d)\n", data, buffer->size);
pthread_cond_broadcast(&(buffer->cond_consumer));
pthread_mutex_unlock(&(buffer->mutex));
sem_post(&(buffer->full)); //增加满缓冲区信号量
usleep(rand()%111111);

}

int buffer_get(Buffer *buffer) {

sem_wait(&(buffer->full)); //等待满缓冲区信号量
pthread_mutex_lock(&(buffer->mutex));
Node *node = buffer->head;
int data = node->data;
buffer->head = node->next;
if (buffer->head == NULL)
{
    buffer->tail = NULL;
}
buffer->size--;
printf("Consumed %d (buffer size: %d)\n", data, buffer->size);
free(node);
pthread_cond_broadcast(&(buffer->cond_producer));
pthread_mutex_unlock(&(buffer->mutex));
sem_post(&(buffer->empty)); //增加空缓冲区信号量
usleep(rand()%100000);
return data;

}

void *producer(void *arg) {

Buffer *buffer = (Buffer *)arg;
time_t start_time = time(NULL);
for (int i = 0;difftime(time(NULL), start_time) <=100; i++)
{

    buffer_put(buffer, i);
}
printf("producers were tied! Stop the project.\n");
exit(0);
return NULL;

}

void *consumer(void *arg) {

Buffer *buffer = (Buffer *)arg;
for (int i = 0; ; i++)
{
    buffer_get(buffer);
}
return NULL;

}

int main() {

Buffer buffer;
buffer_init(&buffer);

pthread_t producer_thread;
pthread_t consumer_thread;

pthread_create(&producer_thread, NULL, producer, &buffer);
pthread_create(&consumer_thread, NULL, consumer, &buffer);

pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);

return 0;

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1599

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?