[ Dodano: 2008-01-05, 12:53 ]
Dobra... Mam takie cos...
Kod: Zaznacz cały
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include "sem.h"
#define S 1
#define N 1
#define ZLEWEJ 100
#define ZPRAWEJ 200
Semafor swiatlo_lewe(N);
Semafor swiatlo_prawe(N);
//Semafor zwezenie(2);
volatile int predkosc=50; // predkosc samochodu m/s
volatile int droga=200; // odcinek do przejazdu m
volatile int czas_zielonego=20; // czas wyswietlania zielonego swiatla w s
volatile int ile_zostalo=czas_zielonego; // ile czasu zostalo do wlaczenia sie czerwonego
void* swiatla(void *info)
{
printf("swiatla start\n");
swiatlo_lewe.P();
swiatlo_prawe.P();
for (int i = 0; i < 3; i++){
printf("puszczamy z lewej\n");
//swiatlo_lewe.V(); // zielone z lewej
system("sleep 1");
//swiatlo_lewe.P(); // czerwone z lewej
printf("czekamy az zjada\n");
//swiatlo_prawe.V(); // zielone z prawej
printf("puszczamy z prawej\n");
system("sleep 1");
//swiatlo_prawe.P(); // czerwone z prawej
printf("czekamy az zjada\n");
}
printf("swiatla stop\n");
return NULL;
}
//--------------------------------------------------------------
struct samochod_info
{
int numer, kierunek;
};
//--------------------------------------------------------------
void* samochod(void *info)
{
samochod_info *psi = (samochod_info*)info;
int numer = psi->numer;
int kierunek = psi->kierunek;
//mojsemafor.P();
switch (kierunek){
case ZLEWEJ :p rintf("samochod %d dojezdza z lewej\n", numer);
swiatlo_lewe.P(); break;
case ZPRAWEJ :p rintf("samochod %d dojezdza z prawej\n", numer);
swiatlo_prawe.P(); break;
}
printf("samochod %d na zwezeniu\n", numer);
system("sleep 1");
printf("samochod %d wyjezdza\n", numer);
//switch (kierunek){
// case ZLEWEJ :swiatlo_prawe.V(); break;
// case ZPRAWEJ :swiatlo_lewe.V(); break;
//}
return NULL;
}
//--------------------------------------------------------------
int main(void)
{ int i;
pthread_t SWIATLA;
pthread_t THREADS[S];
samochod_info si[S];
pthread_create(&SWIATLA,NULL,swiatla,NULL);
for(i=0;i<S;i++)
{
si[i].numer = i;
si[i].kierunek = ZPRAWEJ;
//si[i].kierunek = ZLEWEJ;
pthread_create(&THREADS[i],NULL,samochod,(void*)&si[i]);
}
pthread_join(SWIATLA,NULL);
for(i=0;i<S;i++)
{
pthread_join(THREADS[i],NULL);
}
return 0;
}
Kod: Zaznacz cały
swiatla start
puszczamy z lewej
samochod 0 dojezdza z prawej
czekamy az zjada
puszczamy z prawej
czekamy az zjada
puszczamy z lewej
czekamy az zjada
puszczamy z prawej
czekamy az zjada
puszczamy z lewej
czekamy az zjada
puszczamy z prawej
czekamy az zjada
swiatla stop