编写利用记录型信号量解决生产者消费者问题代码
时间: 2023-11-16 22:07:05 浏览: 102
我们可以使用信号量实现生产者消费者问题。
示例代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
sem_t empty, full;
pthread_mutex_t mutex;
int buffer[10];
int fill = 0;
int use = 0;
void put(int value) {
buffer[fill] = value;
fill = (fill + 1) % 10;
}
int get() {
int tmp = buffer[use];
use = (use + 1) % 10;
return tmp;
}
void *producer(void *arg) {
int i;
for (i = 0; i < 100; i++) {
sem_wait(&empty);
pthread_mutex_lock(&mutex);
put(i);
printf("Producer: %d\n", i);
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int i, tmp = 0;
while (tmp != -1) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
tmp = get();
printf("Consumer: %d\n", tmp);
pthread_mutex_unlock(&mutex);
sem_post(&empty);
}
pthread_exit(NULL);
}
int main() {
pthread_t pid, cid;
sem_init(&empty, 0, 10);
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;
}
```
在这个示例代码中,我们定义了一个大小为10的循环缓冲区(buffer)。生产者通过put函数向缓冲区添加数据,消费者通过get函数从缓冲区取出数据。
empty信号量表示空闲的缓冲区数量,full信号量表示已填充的缓冲区数量。如果缓冲区已满,生产者会等待empty信号量,如果缓冲区已空,消费者会等待full信号量。
使用互斥锁(mutex)来保证对缓冲区的访问是互斥的,避免多个线程同时访问缓冲区导致数据错误。
主函数中创建生产者线程和消费者线程,等待它们完成后销毁信号量和互斥锁。
希望这个示例代码能够帮到您。
阅读全文