Linux下生产者与消费者模型的C语言实现

Linux环境下,实现经典的生产者与消费者模型,我们可以通过C语言实现一个多线程的示例代码,以解决线程之间的同步和互斥问题。以下代码翻译自Windows下的生产者与消费者模式并进行了注释。

示例代码

#include 
#include 
#include 
#include 

#define BUFFER_SIZE 5

int buffer[BUFFER_SIZE];
int count = 0;
sem_t empty;
sem_t full;
pthread_mutex_t mutex;

void *producer(void *param) {
    int item;
    while (1) {
        item = rand() 0;
        sem_wait(∅);
        pthread_mutex_lock(&mutex);

        // 将数据放入缓冲区
        buffer[count++] = item;
        printf("生产者生产了: %d
", item);

        pthread_mutex_unlock(&mutex);
        sem_post(&full);
    }
}

void *consumer(void *param) {
    int item;
    while (1) {
        sem_wait(&full);
        pthread_mutex_lock(&mutex);

        // 从缓冲区读取数据
        item = buffer[--count];
        printf("消费者消费了: %d
", item);

        pthread_mutex_unlock(&mutex);
        sem_post(∅);
    }
}

int main() {
    pthread_t prod_tid, cons_tid;

    // 初始化信号量
    sem_init(∅, 0, BUFFER_SIZE);
    sem_init(&full, 0, 0);
    pthread_mutex_init(&mutex, NULL);

    // 创建生产者和消费者线程
    pthread_create(∏_tid, NULL, producer, NULL);
    pthread_create(&cons_tid, NULL, consumer, NULL);

    // 等待线程结束
    pthread_join(prod_tid, NULL);
    pthread_join(cons_tid, NULL);

    // 销毁信号量和互斥锁
    sem_destroy(∅);
    sem_destroy(&full);
    pthread_mutex_destroy(&mutex);

    return 0;
}

代码解析

  1. 缓冲区:定义了一个大小为5的缓冲区,用于存储生产者生产的物品。
  2. 信号量和互斥锁
    • sem_t empty:表示空缓冲区的数量。
    • sem_t full:表示满缓冲区的数量。
    • pthread_mutex_t mutex:用于确保线程安全,避免生产者和消费者同时操作缓冲区。
  3. 生产者函数:不断生成随机数(模拟生产),并将其放入缓冲区。
  4. 消费者函数:从缓冲区取出数据(模拟消费),并打印。

此实现展示了如何在Linux环境下通过线程信号量控制生产者与消费者问题的同步性和互斥性。

c 文件大小:4.69KB