Strona 2 z 2

: 18 grudnia 2007, 04:36
autor: Dusty
No wlasnie problem w tym, ze nie napisalem... A ksiazke Mitchell'a bym z checia kupil, tylko nie mozna jej dostac bo naklady sa wyczepane ;(

[ 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;

}
Tylko cos nie dziala to tak jak ma dzialac... Mianowicie nie liczy mi samochodow wjezdzajacych i zjezdzajacych... Oto co wyswietla po uruchomieniu...

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
Jakies pomysly? Moze gdzies trzeba zapetlic cos? Pozdro.