2. 三个进程P1、P2、P3使用包含N个单元的缓冲区,P1每次用Produce()生成一个正整数并用put()送入缓冲区的某个空单元;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从缓冲区中取出偶数并用counteven()统计偶数个数,请用信号量实现三个进程的同步与互斥活动。
时间: 2023-12-10 09:38:49 浏览: 143
以下是使用信号量实现三个进程同步和互斥活动的代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define N 10
int buffer[N];
int in = 0, out = 0, count = 0;
sem_t empty, full, mutex;
void *producer(void *arg) {
int item;
while (1) {
item = rand() % 100 + 1; // 生成1~100之间的随机数
sem_wait(&empty);
sem_wait(&mutex);
buffer[in] = item;
printf("Producer produced item: %d\n", item);
in = (in + 1) % N;
count++;
sem_post(&mutex);
sem_post(&full);
sleep(1);
}
}
void *consumer(void *arg) {
int item;
while (1) {
sem_wait(&full);
sem_wait(&mutex);
item = buffer[out];
if (item % 2 == 0) { // 偶数
printf("Consumer consumed even item: %d\n", item);
count--;
sem_post(&mutex);
sem_post(&empty);
} else { // 奇数
out = (out + 1) % N;
count--;
sem_post(&mutex);
sem_post(&empty);
sem_wait(&mutex);
printf("Consumer consumed odd item: %d\n", item);
count--;
sem_post(&mutex);
sem_post(&empty);
}
sleep(1);
}
}
int main() {
pthread_t tid1, tid2;
sem_init(&empty, 0, N);
sem_init(&full, 0, 0);
sem_init(&mutex, 0, 1);
pthread_create(&tid1, NULL, producer, NULL);
pthread_create(&tid2, NULL, consumer, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
sem_destroy(&empty);
sem_destroy(&full);
sem_destroy(&mutex);
return 0;
}
```
在该代码中,我们使用了三个信号量 `empty`、`full` 和 `mutex` 分别表示缓冲区空余空间数量、缓冲区中已有数据数量和互斥锁。生产者线程调用 `sem_wait(&empty)` 和 `sem_wait(&mutex)` 等待空余空间和获取互斥锁,生成一个随机数并将其存入缓冲区中某个空单元,然后释放互斥锁和已有数据信号量 `sem_post(&mutex)` 和 `sem_post(&full)`。消费者线程调用 `sem_wait(&full)` 和 `sem_wait(&mutex)` 等待缓冲区中有数据和获取互斥锁,从缓冲区中取出一个数据,根据其是否为偶数采取不同的操作,最后释放互斥锁和空余空间信号量 `sem_post(&mutex)` 和 `sem_post(&empty)` 或者 `sem_wait(&mutex)` 和 `sem_post(&empty)`。
阅读全文