请采用多进程(或多线程)技术编写一个程序模拟十字路口交通灯控制问题
: 一个十字路口,共有四组红绿灯,每个路口的车辆都遵循“红灯停、绿灯行”的原则,假设将每一台汽车都作为一个进程(线程),请设计良好的机制,展示出合理的“十字路口交通管理”情况。具体要求如下:a、车辆数目:每个路口的车辆数目不超过5辆,程序能够提供参数来设定初始的车辆数目;b、交通灯设定:初始情况一个路口为红灯、一个路口为绿灯;红灯变为绿灯的间隔为3秒,必须保持十字路口交通灯的设定正确;c、车辆通行设定:路口宽度不限,对一个路口而言,只有当一辆车通过路口(越过对面路口的交通灯后)后,其后续车辆才能继续通过交通灯,车辆通过路口的时间可以固定、可以自行计算,但是不能大于等于3秒 (即必须体现交通灯对通行的管制)。
这是题目描述,不用考虑转弯的情况,能否用c语言编写
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
// 信号量定义
sem_t sem_red[4];
sem_t sem_green[4];
// 红绿灯初始化
void init()
{ // 初始化红灯,红灯信号量初始值设为0,表示车辆不能通过
for (int i=0; i<4; i++)
{ sem_init(&sem_red[i], 0, 0);
}
// 初始化绿灯,绿灯信号量初始值设为1,表示车辆可以通过 for (int i=0; i<4; i++) { sem_init(&sem_green[i], 0, 1); } }
// 车辆通行算法
void *car_process(void *arg) {
int *id = (int *)arg;
int car_id = *id;
printf("car %!d(MISSING) starts\n", car_id);
while (1)
{
// 根据车辆的位置,选择对应的信号量
if (car_id < 4)
{
sem_wait(&sem_green[car_id]);
printf("car %!d(MISSING) passes the intersection\n", car_id);
sleep(1);
sem_post(&sem_red[car_id]);
}
else
{
sem_wait(&sem_red[car_id - 4]);
printf("car %!d(MISSING) passes the intersection\n", car_id);
sleep(1);
sem_post(&sem_green[car_id - 4]);
}
}
return NULL;
}
// 交通灯算法 void *light_process(void *arg) { int *id = (int *)arg; int light_id = *id; printf("light %!d(MISSING) starts\n", light_id);
// 循环切换红绿灯
while (1)
{
sem_wait(&sem_red[light_id]);
printf("light %!d(MISSING) turns green\n", light_id);
sleep(3);
sem_post(&sem_green[light_id]);
}
return NULL;
}
int main() { init();
pthread_t light[4];
pthread_t car[5];
// 启动交通灯线程
for (int i=0; i<4; i++)
{
int *id = malloc(sizeof(*id));
*id = i;
pthread_create(&light[i], NULL, light_process, id);
}
// 启动车辆线程
for (int i=0; i<5; i++)
{
int *id = malloc(sizeof(*id));
*id = i;
pthread_create(&car[i], NULL, car_process, id);
}
// 等待线程结束
for (int i=0; i<4; i++)
{
pthread_join(light[i], NULL);
}
for (int i=0; i<5; i++)
{
pthread_join(car[i], NULL);
}
return 0;
}