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

Linux多线程同步实战:基于POSIX信号量实现生产者-消费者模型(小白入门教程)

Linux多线程同步实战:基于POSIX信号量实现生产者-消费者模型(小白入门教程)

Linux多线程同步实战:基于POSIX信号量实现生产者-消费者模型(小白入门教程) Linux多线程 POSIX信号量 生产者-消费者模型 线程同步 第1张

在多线程编程中,线程同步是一个核心问题。本文将带你使用POSIX信号量实现经典的生产者-消费者模型,帮助你深入理解Linux多线程同步机制。

1. 什么是生产者-消费者模型?

生产者-消费者模型描述了两个线程(或多个)共享一个固定大小的缓冲区,生产者负责生产数据放入缓冲区,消费者负责从缓冲区取出数据处理。关键在于避免并发冲突,保证数据一致性。

2. POSIX信号量简介

POSIX信号量是一种用于线程同步的机制,主要函数包括sem_initsem_waitsem_postsem_destroy。信号量可以控制资源的访问数量。

3. 代码实现

    #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) {    int item = 1;    while (1) {        sem_wait(&empty);        pthread_mutex_lock(&mutex);        buffer[in] = item;        printf("生产者生产: %d at %d", item, in);        in = (in + 1) % BUFFER_SIZE;        item++;        pthread_mutex_unlock(&mutex);        sem_post(&full);        sleep(1);    }    return NULL;}void* consumer(void* arg) {    while (1) {        sem_wait(&full);        pthread_mutex_lock(&mutex);        int item = buffer[out];        printf("消费者消费: %d from %d", item, out);        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信号量emptyfull分别表示空闲缓冲区和满缓冲区数量。sem_wait等待资源,sem_post释放资源。互斥锁保证对缓冲区的互斥访问。

4. 运行与总结

编译运行上述代码,你将看到生产者与消费者交替工作。这个例子展示了如何通过线程同步避免竞争条件,是Linux多线程编程的经典案例。掌握生产者-消费者模型,对理解操作系统并发至关重要。

关键词:Linux多线程、POSIX信号量、生产者-消费者模型、线程同步