当前位置:首页 > 系统教程 > 正文

多线程同步实战:基于POSIX信号量的生产者-消费者模型

多线程同步实战:基于POSIX信号量的生产者-消费者模型

Linux线程编程指南

Linux线程编程中,多线程同步是确保程序正确运行的关键技术。本文将详细讲解如何使用POSIX信号量实现经典的生产者-消费者模型,帮助小白从零掌握并发编程基础。

生产者-消费者模型是一种多线程设计模式,其中生产者线程生成数据,消费者线程处理数据,它们通过共享缓冲区通信。为了避免数据竞争,需要使用同步机制协调访问。

多线程同步实战:基于POSIX信号量的生产者-消费者模型 多线程同步 POSIX信号量 生产者-消费者模型 Linux线程编程 第1张

POSIX信号量是Linux系统提供的同步工具,用于控制线程对共享资源的访问。在生产者-消费者模型中,通常使用两个信号量:一个表示缓冲区空位数量,另一个表示缓冲区中数据项数量。

实现步骤

  1. 初始化共享缓冲区和信号量。
  2. 创建生产者线程和消费者线程。
  3. 生产者线程:等待空位信号量,生产数据并放入缓冲区,发布数据信号量。
  4. 消费者线程:等待数据信号量,从缓冲区取出数据并处理,发布空位信号量。
  5. 等待线程结束,清理资源。

代码示例

#include #include #include #include #define BUFFER_SIZE 5int buffer[BUFFER_SIZE];int in = 0, out = 0;sem_t empty, full;pthread_mutex_t mutex;void *producer(void *arg) {    for (int i = 0; i < 10; i++) {        sem_wait(&empty);        pthread_mutex_lock(&mutex);                buffer[in] = i;        printf("生产者生产: %d", i);        in = (in + 1) % BUFFER_SIZE;                pthread_mutex_unlock(&mutex);        sem_post(&full);        sleep(1);    }    return NULL;}void *consumer(void *arg) {    for (int i = 0; i < 10; i++) {        sem_wait(&full);        pthread_mutex_lock(&mutex);                int item = buffer[out];        printf("消费者消费: %d", item);        out = (out + 1) % BUFFER_SIZE;                pthread_mutex_unlock(&mutex);        sem_post(&empty);        sleep(2);    }    return NULL;}int main() {    pthread_t prod, cons;        sem_init(&empty, 0, BUFFER_SIZE);    sem_init(&full, 0, 0);    pthread_mutex_init(&mutex, NULL);        pthread_create(&prod, NULL, producer, NULL);    pthread_create(&cons, NULL, consumer, NULL);        pthread_join(prod, NULL);    pthread_join(cons, NULL);        sem_destroy(&empty);    sem_destroy(&full);    pthread_mutex_destroy(&mutex);        return 0;}

此代码展示了多线程同步的核心:使用POSIX信号量和互斥锁确保生产者-消费者模型Linux线程环境中的安全运行。信号量emptyfull分别控制缓冲区空位和数据数量,互斥锁保护缓冲区访问。

总结

通过本教程,你学习了基于POSIX信号量的生产者-消费者模型实现。掌握这些多线程同步技术,能帮助你在Linux线程编程中构建高效、可靠的并发应用。持续练习POSIX信号量生产者-消费者模型,以深化对并发编程的理解。