C语言代码:有一个师傅进程和三个学徒进程,每个学徒连续不断地组装产品,做一个产品需要A、B、C三种零件,这三个学徒分别掌握有A零件、B零件、C零件多个。 要求完成以下功能: (1)师傅源源不断地供应上述三种零件,但他每次只将其中的两种零件放在桌子上(所放零件由rand % 3函数生成的0-2之间的随机数决定)。 (2)具有另一零件的学徒就可以组装产品,且做完后给师傅发信号,然后师傅再拿出两种零件放在桌上。 (3)每次只能有一个进程放入或取出零件。 (4)利用同步与互斥的相关知识编写仿真系统实现以上过程,要能够清晰表达产品生产的全过程。
时间: 2024-02-15 07:03:47 浏览: 151
以下是基于信号量实现的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX_NUM 3 // 零件最多数量
#define NUM_PRODUCERS 1 // 师傅进程数量
#define NUM_CONSUMERS 3 // 学徒进程数量
sem_t sem_a, sem_b, sem_c; // 三种零件的信号量
sem_t sem_master, sem_apprentice; // 师傅、学徒之间的信号量
int a_count = 0, b_count = 0, c_count = 0; // 三种零件的数量
void *producer(void *arg) {
while (1) {
// 随机生成两种零件
int part1 = rand() % 3;
int part2 = rand() % 3;
while (part1 == part2) {
part2 = rand() % 3;
}
// 放入两种零件
if (part1 == 0 && part2 == 1) {
sem_post(&sem_a);
sem_post(&sem_b);
} else if (part1 == 0 && part2 == 2) {
sem_post(&sem_a);
sem_post(&sem_c);
} else {
sem_post(&sem_b);
sem_post(&sem_c);
}
printf("师傅: 放入 %c%c\n", part1 + 'A', part2 + 'A');
sem_post(&sem_master); // 发出信号
sleep(1);
}
}
void *consumer(void *arg) {
int part = *(int*) arg;
while (1) {
sem_wait(&sem_master); // 等待信号
// 判断是否有另一种零件
if (part == 0 && a_count > 0 && b_count > 0) {
sem_wait(&sem_a);
sem_wait(&sem_b);
a_count--;
b_count--;
printf("学徒%d: 组装 AB 成功\n", part + 1);
sem_post(&sem_apprentice); // 发出信号
} else if (part == 1 && a_count > 0 && c_count > 0) {
sem_wait(&sem_a);
sem_wait(&sem_c);
a_count--;
c_count--;
printf("学徒%d: 组装 AC 成功\n", part + 1);
sem_post(&sem_apprentice); // 发出信号
} else if (part == 2 && b_count > 0 && c_count > 0) {
sem_wait(&sem_b);
sem_wait(&sem_c);
b_count--;
c_count--;
printf("学徒%d: 组装 BC 成功\n", part + 1);
sem_post(&sem_apprentice); // 发出信号
} else {
printf("学徒%d: 没有另一种零件\n", part + 1);
}
}
}
int main() {
srand(time(NULL));
sem_init(&sem_a, 0, 0);
sem_init(&sem_b, 0, 0);
sem_init(&sem_c, 0, 0);
sem_init(&sem_master, 0, 0);
sem_init(&sem_apprentice, 0, 0);
pthread_t t_producer, t_consumer[NUM_CONSUMERS];
pthread_create(&t_producer, NULL, producer, NULL);
int parts[NUM_CONSUMERS] = {0, 1, 2};
for (int i = 0; i < NUM_CONSUMERS; i++) {
pthread_create(&t_consumer[i], NULL, consumer, &parts[i]);
}
while (1) {
// 随机生成一种零件
int part = rand() % 3;
if (part == 0) {
a_count++;
} else if (part == 1) {
b_count++;
} else {
c_count++;
}
printf("生产: 产生 %c\n", part + 'A');
sem_post(&sem_master); // 发出信号
sem_wait(&sem_apprentice); // 等待信号
}
return 0;
}
```
程序中,信号量 `sem_a`、`sem_b`、`sem_c` 分别表示 A、B、C 零件的数量,信号量 `sem_master` 表示师傅放入两种零件的信号,信号量 `sem_apprentice` 表示学徒组装成功的信号。师傅进程在循环中随机生成两种零件并放入桌子上,然后发出信号;学徒进程在循环中等待信号,如果有另一种零件则取出两种零件并组装,然后发出信号;生产线程在循环中随机生成一种零件并放入仓库,然后发出信号,等待学徒组装成功的信号。需要注意的是,每个进程只能在信号量为正时才能执行 `sem_wait` 操作,否则会阻塞等待。
阅读全文