linux生产者消费者源程序代码
时间: 2023-11-21 07:14:01 浏览: 30
以下是一个简单的 Linux 生产者消费者问题的源代码:
```c
#include <stdio.h>
#include <pthread.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int count = 0; // 缓冲区中的元素数
int in = 0; // 插入位置
int out = 0; // 取出位置
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 初始化互斥锁
pthread_cond_t full = PTHREAD_COND_INITIALIZER; // 初始化条件变量
pthread_cond_t empty = PTHREAD_COND_INITIALIZER;
void *producer(void *arg) {
int i;
for (i = 0; i < BUFFER_SIZE * 2; i++) {
pthread_mutex_lock(&mutex);
while (count == BUFFER_SIZE) // 如果缓冲区满了,等待消费者取出
pthread_cond_wait(&empty, &mutex);
buffer[in] = i;
in = (in + 1) % BUFFER_SIZE;
count++;
pthread_cond_signal(&full); // 通知消费者可以取出数据了
pthread_mutex_unlock(&mutex);
}
}
void *consumer(void *arg) {
int i, data;
for (i = 0; i < BUFFER_SIZE * 2; i++) {
pthread_mutex_lock(&mutex);
while (count == 0) // 如果缓冲区空了,等待生产者插入数据
pthread_cond_wait(&full, &mutex);
data = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
pthread_cond_signal(&empty); // 通知生产者可以插入数据了
pthread_mutex_unlock(&mutex);
printf("%d\n", data);
}
}
int main() {
pthread_t producer_t, consumer_t;
pthread_create(&producer_t, NULL, producer, NULL);
pthread_create(&consumer_t, NULL, consumer, NULL);
pthread_join(producer_t, NULL);
pthread_join(consumer_t, NULL);
return 0;
}
```
这个程序使用了一个互斥锁来保护缓冲区和计数器的访问,并使用条件变量来同步生产者和消费者的操作。生产者线程不断地向缓冲区中插入数据,如果缓冲区已满,则等待消费者取出数据;消费者线程不断地从缓冲区中取出数据,如果缓冲区已空,则等待生产者插入数据。当生产者线程插入数据时,它会通知消费者线程可以取出数据了;当消费者线程取出数据时,它会通知生产者线程可以插入数据了。