|
Wątki, muteksy i semafory.
Dusty - 15-12-2007 19:47
Witam all. Mam pytanko... Czy ktoś z Was miał kiedykolwiek do czynienia (jeśli chodzi o systemy operacyjne) z wątkami, semaforami, muteksami itp. itd.? Potrzebuje pewnej pomocy. Dzięki za odpowiedź. Pozdro.
0dd - 15-12-2007 21:04
na linuxie mialem do czynienia z tego typu zabawkami, na window$ie nie.
Dusty - 16-12-2007 20:05
No właśnie mi o linuxa chodzi... Pod windą nie wiem czy wogole cos takiego jest... Odd a qmasz to dobrze? Bo mam zadanko takie małe i moze bys pomogl troche jak wiesz o co chodzi. Pozdro. Ps. Od razu wkleje treść zadanka:
Roboty drogowe. Na pewnym odcinku drogi z Białegostoku do Kuźnicy z powodu robót drogowych zamknięto jeden pas ruchu. Na obu końcach odcinka zainstalowano sygnalizację świetlną. Możliwe kombinacje świateł to: (1) prawy koniec – zielone, lewy koniec – czerwone: na odcinek mogą wjeżdżać samochody jadące od Białegostoku, samochody od strony Kuźnicy czekają na swoją kolejkę; (2) prawy koniec – czerwone, lewy koniec – czerwone: zmiana kierunku ruchu, oczekiwanie, aż ostatni pojazd opuści zwężony odcinek; (3) prawy koniec – zielone, lewy koniec – czerwone: na zwężony odcinek mogą wjeżdżać pojazdy jadące od strony Kuźnicy. Implementacja: a) – założyć, że na odcinku może przebywać na raz tylko jeden pojazd b) – założyć, że na odcinku może przebywać na raz N pojazdów (jadących w jedną stronę z jednakową prędkością) c) – założyć, że na odcinku drogi może przebywać na raz nieokreślona ilość pojazdów, zależąca od ich prędkości (prędkość pojazdu można zasymulować funkcją nanosleep, określającą czas przejazdu pojazd przez rozkopany odcinek).
0dd - 16-12-2007 20:46
Pod windą nie wiem czy wogole cos takiego jest... Odd a qmasz to dobrze?
pewno ze pod window$em sa takie rzeczy, dlaczego niby nie mialo by ich byc? a co do kumania to tak sie sklada ze udalo mi sie napisac pare programow wspolbieznych
ja bym zrobil tak: oba konce drogi jako semafory binarne a) droge mozesz zrobic na mutexie b) droga na semaforze c) synchronizowany obaszar pamieci wspoldzielone przechowujacy ilosc pojazdow na drodze? wydaje mi sie ze na semaforze tez sie bedzie dalo jezeli wykorzystasz go jako licznik
Dusty - 17-12-2007 18:29
Odd, a jak znajdziesz chwilke to mozesz to naskrobac w np. c lub c++ ;) bo ja totalna noga z tego... Albo chociaz jakis szkielet tego...
salmon - 17-12-2007 19:08
Daj od razu maila do prowadzącego, to się mu wyśle :p
Dusty - 17-12-2007 20:14
Masz dusty@onet.eu ;P
0dd - 17-12-2007 20:17
niestety pisac za Ciebie nie bede chocby dlatego ze lepiej bedzie dla Ciebie jak sie tego nauczysz, napisalem Ci jak ja to widzie reszta nalezy do Ciebie. Powodzenia! tak przy okazji polecam "Linux. Programowanie dla zaawansowanych" - Mark Mitchell
Dusty - 17-12-2007 20:25
Ok, przesadzilem z tym pisaniem za mnie... Ale Odd moze cos wiecej mi wytlumaczysz, bo wogole nie wiem od ktorej strony sie za to zabrac... Jak zakumam o co to wogole chodzi to mysle ze napisze juz to wszystko sam jakos... Pozdro. Jak mozesz to napisz jakby to mialo mniej wiecej dzialac...
0dd - 17-12-2007 20:59
nie rozumiem czego nierozumiesz. robisz sobie semafor binarny (taki dwuwartosciowy), pare watkow, jakiegos mutexa, odpalasz i wszystko chodzi. a tak naserio to jesli kiedykolwiek w zyciu napisalez program wspolbiezny z sekcjami krytycznymi to dasz sobie rade.
Dusty - 18-12-2007 04:36
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...
#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 :printf("samochod %d dojezdza z lewej\n", numer); swiatlo_lewe.P(); break; case ZPRAWEJ :printf("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...
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.
zanotowane.pldoc.pisz.plpdf.pisz.plminister.pev.pl
|