生产者消费者优化代码c语言
时间: 2023-08-02 12:07:48 浏览: 98
下面是一个简单的生产者消费者模型的优化代码,使用信号量和多线程来实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
sem_t empty;
sem_t full;
pthread_mutex_t mutex;
int in = 0;
int out = 0;
void *producer(void *arg) {
int i, item;
for (i = 0; i < 10; i++) {
item = rand();
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer produces item %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < 10; i++) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer consumes item %d\n", item);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
pthread_exit(NULL);
}
int main() {
pthread_t pid, cid;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
pthread_create(&pid, NULL, producer, NULL);
pthread_create(&cid, NULL, consumer, NULL);
pthread_join(pid, NULL);
pthread_join(cid, NULL);
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在这个代码中,我们使用了两个信号量 `empty` 和 `full` 来控制缓冲区的空/满状态,使用一个互斥锁 `mutex` 来保证多线程间的安全访问。在生产者和消费者线程中,我们使用 `sem_wait` 和 `sem_post` 函数来操作信号量,使用 `pthread_mutex_lock` 和 `pthread_mutex_unlock` 函数来操作互斥锁。这样就能够保证生产者和消费者之间的同步和互斥,避免了竞争条件和死锁的问题。
阅读全文