1、设自行车生产线上有一只箱子,其中有N个位置(N≥3),每个位置可存放一个车架或一个车轮,又设有三名工人,其活动分别为:
用信号量PV操作编程实现三个工人的合作,不能出现死锁。要求N的大小可自定义,显示自行车生产组装的过程。(25分)
解:
分析:根据题目意义分析,该题所述作业工人1、工人2与工人3构成生产者与消费者关系,存在着生产者-消费者问题的同步关系,涉及的知识点包括:信号量、PV原语、进程同步、死锁问题等。
解决思路:先不考虑死锁问题,工人1、2分别与3是生产者和消费者关系。箱子内的空位是工人1、2的资源,车架和车轮是工人3的资源。定义三个信号灯如下:
semaphore empty=N;//箱子内的空位
semaphore weel=0;//车轮
semaphore frame=0;//车架
再来看死锁问题:如果说工人1或者工人2某一方生产速度很快,N个空位全部为车轮,或者≥N-1个空位是车架的话(此时最多只能放入一个车轮),工人3永远得不到组装一个完整的车的资源,就会发生死锁。所以车架最多不能达到N-2个,也就是车架的信号量初值要设置为N-2,车轮要设置为N-1。
伪代码如下:
semaphore empty = N;//空位置数量
semaphore maxframe = N-2;//箱中最大车架数量
semaphore maxwheel = N-1;//箱中最大车轮数量
semaphore frame = 0;//车架数量
semaphore wheel = 0;//车轮数量
do{
//工人1活动
P(maxframe);
P(empty);
加工一个车架;
车架放入箱中;
V(frame);
}while(1)
do{
//工人2活动
P(maxwheel);
P(empty);
加工一个车轮;
车轮放入箱中;
V(wheel);
}while(1)
do{
//工人3活动
P(frame);
P(wheel);
P(wheel);
箱中取一个车架;
箱中取一个车架;
组装一台车;
V(maxframe);
V(maxwheel);
V(maxwheel);
V(empty);
V(empty);
V(empty);
}while(1)
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
#include <semaphore.h>
sem_t empty;//箱子内的空位
sem_t wheel;//车轮
sem_t frame;//车架
sem_t s1;//车架最大值
sem_t s2;//车轮最大值
pthread_t worker1_thread, worker2_thread, worker3_thread;//声明三个工人的线程
void * worker1Thread(void *i)
{
while(1)
{
sleep(2);//工人1生产一个车架
printf("worker1 products a frame!\n");
sem_wait(&empty);
sem_wait(&s1);
sleep(1);//工人1将车架放入箱子
printf("worker1 places a frame in the box!\n");
sem_post(&frame);
}
}
void * worker2Thread(void *i)
{
while(1)
{
sleep(1);//工人2生产一个车轮
printf("worker2 products a wheel!\n");
sem_wait(&empty);
sem_wait(&s2);
sleep(1);//工人2将车轮放入箱子
printf("worker2 places a wheel in the box!\n");
sem_post(&wheel);
}
}
void * worker3Thread(void *i)
{
while(1)
{
sem_wait(&frame);
sleep(1);//工人3从箱子中拿一个车架
printf("worker3 takes out a frame from the box!\n");
sem_post(&empty);
sem_post(&s1);
sem_wait(&wheel);
sem_wait(&wheel);
sleep(2);//工人3从箱子中拿两个车轮
printf("worker3 takes out two wheels from the box!\n");
sem_post(&empty);
sem_post(&empty);
sem_post(&s2);
sem_post(&s2);
sleep(3);//工人3生产一辆自行车
printf("worker3 products a bicycle!\n");
}
}
int main(){
int N;
printf("Please enter the number of the box positions:");
scanf("%d",&N);
printf("\n");
//初始化信号量
sem_init(&empty, 1, N);
sem_init