线程信号量同步与互斥:生产者和消费者共享1个缓冲区,创建两个线程分别作为生产者和消费者 #include <pthread.h> #include <semaphore.h>
时间: 2023-09-12 08:06:40 浏览: 99
下面是一个使用信号量实现生产者-消费者模型的示例代码:
```c
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in = 0, out = 0;
sem_t mutex, empty, full;
void *producer(void *arg) {
int i, item;
for (i = 0; i < 20; i++) {
item = i;
sem_wait(&empty); // 等待缓冲区不为空
sem_wait(&mutex); // 申请互斥访问缓冲区
buffer[in] = item;
in = (in + 1) % BUFFER_SIZE;
printf("Producer put item %d in buffer.\n", item);
sem_post(&mutex); // 释放互斥访问缓冲区
sem_post(&full); // 通知缓冲区不为空
}
pthread_exit(NULL);
}
void *consumer(void *arg) {
int i, item;
for (i = 0; i < 20; i++) {
sem_wait(&full); // 等待缓冲区不为满
sem_wait(&mutex); // 申请互斥访问缓冲区
item = buffer[out];
out = (out + 1) % BUFFER_SIZE;
printf("Consumer get item %d from buffer.\n", item);
sem_post(&mutex); // 释放互斥访问缓冲区
sem_post(&empty); // 通知缓冲区不为满
}
pthread_exit(NULL);
}
int main() {
pthread_t p_tid, c_tid;
sem_init(&mutex, 0, 1); // 初始化互斥信号量
sem_init(&empty, 0, BUFFER_SIZE); // 初始化空缓冲区信号量
sem_init(&full, 0, 0); // 初始化满缓冲区信号量
pthread_create(&p_tid, NULL, producer, NULL);
pthread_create(&c_tid, NULL, consumer, NULL);
pthread_join(p_tid, NULL);
pthread_join(c_tid, NULL);
sem_destroy(&mutex);
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
```
在上面的示例中,我们使用了三个信号量来控制生产者和消费者的行为:
- `mutex`:互斥信号量,用于保护缓冲区的读写操作。
- `empty`:空缓冲区信号量,表示缓冲区中还有多少空位置可以写入数据。
- `full`:满缓冲区信号量,表示缓冲区中已经有多少数据可以读取。
生产者线程在生产一个新的数据项之前,需要等待空缓冲区信号量。如果缓冲区已经满了,生产者线程需要等待消费者线程把一些数据从缓冲区中读取出来,才能继续生产新的数据项。生产者线程写入数据时,需要先申请互斥信号量,防止和其他线程同时访问缓冲区。写入数据完成后,需要释放互斥信号量,并通知消费者线程缓冲区不为空。
消费者线程在读取一个数据项之前,需要等待满缓冲区信号量。如果缓冲区已经为空,消费者线程需要等待生产者线程把一些数据写入缓冲区,才能继续读取数据。消费者线程读取数据时,也需要先申请互斥信号量,防止和其他线程同时访问缓冲区。读取数据完成后,需要释放互斥信号量,并通知生产者线程缓冲区不为满。
以上就是使用信号量实现生产者-消费者模型的基本思路。在实际应用中,需要根据具体情况进行适当的调整和优化,以达到更好的性能和稳定性。
阅读全文