c语言实现有一个师傅进程和三个学徒进程,每个学徒连续不断地组装产品,做一个产品需要A. B、C三种零件,这三个学徒分别掌握有A零件、B零件、C零件多个。 要求完成以下功能: (1)师傅源源不断地供应上述三种零件,但他每次只将其中的两种零件放在桌子上(所 放零件由rand%3函数生成的0-2之间的随机数决定)。 (2)具有另一零件的学徒就可以组装产品,且做完后给师傅发信号,然后师傅再拿出 两种零件放在桌上。 3)每次只能有一个进程放入或取出零件。 (4)利用同步与互斥的相关知识编写仿真系统实现以上过程,要能够清晰表达产品生 产的全过程。
时间: 2024-02-15 12:04:28 浏览: 66
以下是使用进程间通信实现的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
#define NUM_THREADS 4 // 线程数
#define BUF_SIZE 2 // 零件桌上最多放置的零件个数
int buf[BUF_SIZE]; // 零件桌上的零件
int in = 0, out = 0; // 零件桌上的零件的放置和取走位置
sem_t empty, full; // 信号量,empty表示空位数,full表示已放置的零件数
pthread_mutex_t mutex; // 互斥锁,用于保证临界区的同步访问
pthread_t threads[NUM_THREADS]; // 线程数组
void *producer(void *arg) {
int id = *(int *)arg;
while (1) {
int part1 = rand() % 3; // 随机生成两个零件
int part2 = rand() % 3;
if (part1 == part2) continue; // 避免生成相同的两个零件
sem_wait(&empty); // 等待空位
pthread_mutex_lock(&mutex); // 加锁
buf[in] = part1;
in = (in + 1) % BUF_SIZE;
buf[in] = part2;
in = (in + 1) % BUF_SIZE;
printf("Producer %d puts part %d and %d on the table.\n", id, part1, part2);
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&full); // 发送已放置的零件数信号
sleep(1); // 休息一下
}
}
void *consumer(void *arg) {
int id = *(int *)arg;
int parts[3] = {0}; // 记录学徒拥有的零件
while (1) {
sem_wait(&full); // 等待已放置的零件数
pthread_mutex_lock(&mutex); // 加锁
parts[buf[out]]++; // 取出一个零件
out = (out + 1) % BUF_SIZE;
parts[buf[out]]++; // 取出另一个零件
out = (out + 1) % BUF_SIZE;
printf("Apprentice %d takes part %d and %d from the table.\n", id, buf[out - 1], buf[out]);
if (parts[0] > 0 && parts[1] > 0 && parts[2] > 0) {
parts[0]--; parts[1]--; parts[2]--; // 组装产品
printf("Apprentice %d assembles a product.\n", id);
sem_post(&empty); // 发送空位数信号
}
pthread_mutex_unlock(&mutex); // 解锁
sleep(1); // 休息一下
}
}
int main() {
srand(time(NULL)); // 随机种子
sem_init(&empty, 0, BUF_SIZE); // 初始化信号量
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL); // 初始化互斥锁
int i, id[NUM_THREADS];
for (i = 0; i < NUM_THREADS; i++) {
id[i] = i;
if (i == 0) pthread_create(&threads[i], NULL, producer, (void *)&id[i]);
else pthread_create(&threads[i], NULL, consumer, (void *)&id[i]);
}
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL); // 等待线程结束
}
sem_destroy(&empty); // 销毁信号量和互斥锁
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
该程序中,producer线程模拟师傅进程,每次生成两个不同的零件并放置在零件桌上。consumer线程模拟学徒进程,每次从零件桌上取走两个零件,如果拥有三种零件就组装一个产品。程序使用了信号量和互斥锁来保证线程之间的同步和互斥访问。
阅读全文