📜  C中的生产者消费者问题(1)

📅  最后修改于: 2023-12-03 15:00:11.949000             🧑  作者: Mango

C中的生产者消费者问题

概述

在计算机科学中,“生产者-消费者”问题是指一个有限缓冲区,可以同时由一或多个生产者往缓冲区产生产品,也可以同时有一或多个消费者从缓冲区消费产品的问题。

生产者

生产者产生产品并放入缓冲区

消费者

消费者从缓冲区中取出产品来消费

缓冲区

缓冲区是一个有限的数据缓存区,用于存放生产者产生的产品,以供消费者消费。

解决方案

临界区问题,使用信号量来解决互斥和同步问题

信号量

信号量是操作系统中的同步机制,是一种特殊的变量。信号量有两个操作,分别是 P 操作和 V 操作。P 操作是请求资源,V 操作是释放资源。如果信号量大于等于 0,表示资源可用,执行 P 操作后将信号量-1;如果信号量小于 0,表示资源不足,执行 P 操作会被阻塞。执行 V 操作会将信号量加 1,唤醒阻塞的进程。

互斥锁

互斥锁是保证同一时间只有一个线程访问共享资源的锁。

条件变量

条件变量是一种进程间通信机制,用于线程之间的同步。条件变量基于一个互斥锁,用于阻塞一个线程,当条件不满足时,线程进入阻塞状态等待其它线程发送条件通知。

代码示例
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>

#define BUFFER_SIZE 10

int buffer[BUFFER_SIZE];
int buffer_index;
pthread_mutex_t mutex;
sem_t full_sem;
sem_t empty_sem;

void *producer(void *arg) {
    int i;
    for (i = 0; i < 100; i++) {
        sem_wait(&empty_sem);
        pthread_mutex_lock(&mutex);
        buffer[buffer_index++] = i;
        pthread_mutex_unlock(&mutex);
        sem_post(&full_sem);
    }
    return NULL;
}

void *consumer(void *arg) {
    int i;
    for (i = 0; i < 100; i++) {
        sem_wait(&full_sem);
        pthread_mutex_lock(&mutex);
        int item = buffer[--buffer_index];
        printf("consume item: %d\n", item);
        pthread_mutex_unlock(&mutex);
        sem_post(&empty_sem);
    }
    return NULL;
}

int main(int argc, char *argv[]) {
    pthread_t producer_thread, consumer_thread;

    pthread_mutex_init(&mutex, NULL);
    sem_init(&full_sem, 0, 0);
    sem_init(&empty_sem, 0, BUFFER_SIZE);

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

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

    pthread_mutex_destroy(&mutex);
    sem_destroy(&full_sem);
    sem_destroy(&empty_sem);

    return 0;
}

以上是一个简单的生产者消费者问题的解决方案,使用了互斥锁和条件变量来解决共享资源的同步问题,使用了信号量来解决生产者消费者之间的协调问题。

总结

生产者消费者问题是计算机科学中的一个经典问题,本文介绍了其解决方案中使用的同步机制,主要是信号量、互斥锁和条件变量。希望本文能够帮助到刚刚接触生产者消费者问题的程序员们。